diff --git a/demo_misc/vp9_opus_sw/src/main/AndroidManifest.xml b/demo_misc/vp9_opus_sw/src/main/AndroidManifest.xml index 9824d7c1c5..fa687f48f5 100644 --- a/demo_misc/vp9_opus_sw/src/main/AndroidManifest.xml +++ b/demo_misc/vp9_opus_sw/src/main/AndroidManifest.xml @@ -44,14 +44,11 @@ - - - diff --git a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/DashRendererBuilder.java b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/DashRendererBuilder.java index 98a4b03da2..06d05070f9 100644 --- a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/DashRendererBuilder.java +++ b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/DashRendererBuilder.java @@ -57,9 +57,9 @@ public class DashRendererBuilder implements ManifestCallback listItems; - private List itemPaths; - private TextView currentPathView; - private File root; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.file_picker_activity); - setResult(Activity.RESULT_CANCELED); - currentPathView = (TextView) findViewById(R.id.path); - root = new File(Environment.getExternalStorageDirectory().getPath()); - setDirectory(root); - } - - private void setDirectory(File directory) { - currentPathView.setText(getString(R.string.current_path, directory.getAbsolutePath())); - listItems = new ArrayList<>(); - itemPaths = new ArrayList<>(); - File[] files = directory.listFiles(); - - if (!directory.getAbsolutePath().equals(root.getAbsolutePath())) { - listItems.add(root.getAbsolutePath()); - itemPaths.add(root); - listItems.add("../"); - itemPaths.add(new File(directory.getParent())); - } - - if (files != null) { - for (File file : files) { - if (!file.isHidden() && file.canRead()) { - itemPaths.add(file); - if (file.isDirectory()) { - listItems.add(file.getName() + File.separator); - } else { - listItems.add(file.getName()); - } - } - } - } - - setListAdapter(new ArrayAdapter<>(this, R.layout.rows, listItems)); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id) { - File file = itemPaths.get(position); - if (file.isDirectory() && file.canRead()) { - setDirectory(itemPaths.get(position)); - } else { - Intent intent = new Intent(); - intent.putExtra(FILENAME_EXTRA_ID, file.getAbsolutePath()); - setResult(Activity.RESULT_OK, intent); - finish(); - } - } -} diff --git a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/PlayerActivity.java similarity index 81% rename from demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java rename to demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/PlayerActivity.java index d84618474a..a8a658f88b 100644 --- a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java +++ b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/PlayerActivity.java @@ -30,8 +30,11 @@ import com.google.android.exoplayer.upstream.DefaultUriDataSource; import com.google.android.exoplayer.util.PlayerControl; import com.google.android.exoplayer.util.Util; +import android.Manifest.permission; +import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -39,32 +42,23 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceView; import android.view.View; -import android.view.View.OnClickListener; import android.view.View.OnTouchListener; -import android.widget.Button; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; -import java.io.File; - /** * Sample player that shows how to use ExoPlayer Extensions to playback VP9 Video and Opus Audio. */ -public class VideoPlayer extends Activity implements OnClickListener, - LibvpxVideoTrackRenderer.EventListener, ExoPlayer.Listener { +public class PlayerActivity extends Activity implements + LibvpxVideoTrackRenderer.EventListener, ExoPlayer.Listener { - public static final String DASH_MANIFEST_URL_ID_EXTRA = "manifest_url"; public static final String USE_OPENGL_ID_EXTRA = "use_opengl"; - private static final int FILE_PICKER_REQUEST = 1; private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; private static final int BUFFER_SEGMENT_COUNT = 160; - private boolean isDash; - private String manifestUrl; private boolean useOpenGL; - private String filename; private ExoPlayer player; private Handler handler; @@ -75,14 +69,14 @@ public class VideoPlayer extends Activity implements OnClickListener, private TextView debugInfoView; private String debugInfo; private String playerState; + private Uri contentUri; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); - manifestUrl = intent.getStringExtra(DASH_MANIFEST_URL_ID_EXTRA); - isDash = manifestUrl != null; + contentUri = intent.getData(); useOpenGL = intent.getBooleanExtra(USE_OPENGL_ID_EXTRA, true); handler = new Handler(); @@ -109,16 +103,17 @@ public class VideoPlayer extends Activity implements OnClickListener, debugInfoView = (TextView) findViewById(R.id.debug_info); debugInfo = ""; playerState = ""; - filename = ""; updateDebugInfoTextView(); - // Set the buttons' onclick listeners. - ((Button) findViewById(R.id.choose_file)).setOnClickListener(this); - ((Button) findViewById(R.id.play)).setOnClickListener(this); + if (!maybeRequestPermission()) { + startPlayback(); + } + } - // In case of DASH, start playback right away. - if (isDash) { - findViewById(R.id.buttons).setVisibility(View.GONE); + private void startPlayback() { + if (Util.isLocalFileUri(contentUri)) { + startBasicPlayback(); + } else { startDashPlayback(); } } @@ -129,44 +124,13 @@ public class VideoPlayer extends Activity implements OnClickListener, stopPlayback(); } - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.choose_file: - Intent intent = new Intent(); - intent.setClass(this, FilePickerActivity.class); - startActivityForResult(intent, FILE_PICKER_REQUEST); - break; - case R.id.play: - startBasicPlayback(); - break; - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case FILE_PICKER_REQUEST: - if (resultCode == Activity.RESULT_OK) { - filename = data.getStringExtra(FilePickerActivity.FILENAME_EXTRA_ID); - updateDebugInfoTextView(); - } - break; - } - } - private void startBasicPlayback() { - if (filename == null) { - Toast.makeText(this, "Choose a file!", Toast.LENGTH_SHORT).show(); - return; - } - findViewById(R.id.buttons).setVisibility(View.GONE); player = ExoPlayer.Factory.newInstance(2); player.addListener(this); mediaController.setMediaPlayer(new PlayerControl(player)); mediaController.setEnabled(true); ExtractorSampleSource sampleSource = new ExtractorSampleSource( - Uri.fromFile(new File(filename)), + contentUri, new DefaultUriDataSource(this, Util.getUserAgent(this, "ExoPlayerExtWebMDemo")), new DefaultAllocator(BUFFER_SEGMENT_SIZE), BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT, new WebmExtractor()); @@ -192,7 +156,8 @@ public class VideoPlayer extends Activity implements OnClickListener, updateDebugInfoTextView(); final String userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like" + " Gecko) Chrome/38.0.2125.104 Safari/537.36"; - DashRendererBuilder rendererBuilder = new DashRendererBuilder(manifestUrl, userAgent, this); + DashRendererBuilder rendererBuilder = new DashRendererBuilder(contentUri.toString(), + userAgent, this); rendererBuilder.build(); } @@ -269,6 +234,45 @@ public class VideoPlayer extends Activity implements OnClickListener, return handler; } + // Permission management methods + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startPlayback(); + } else { + Toast.makeText(getApplicationContext(), R.string.storage_permission_denied, + Toast.LENGTH_LONG).show(); + finish(); + } + } + + /** + * Checks whether it is necessary to ask for permission to read storage. If necessary, it also + * requests permission. + * + * @return true if a permission request is made. False if it is not necessary. + */ + @TargetApi(23) + private boolean maybeRequestPermission() { + if (requiresPermission(contentUri)) { + requestPermissions(new String[] {permission.READ_EXTERNAL_STORAGE}, 0); + return true; + } else { + return false; + } + } + + @TargetApi(23) + private boolean requiresPermission(Uri uri) { + return Util.SDK_INT >= 23 && Util.isLocalFileUri(uri) + && checkSelfPermission(permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED; + } + + // Internal methods + private void stopPlayback() { if (player != null) { player.stop(); @@ -277,7 +281,7 @@ public class VideoPlayer extends Activity implements OnClickListener, } } - private void toggleControlsVisibility() { + private void toggleControlsVisibility() { if (mediaController != null && player != null) { if (mediaController.isShowing()) { mediaController.hide(); @@ -295,7 +299,7 @@ public class VideoPlayer extends Activity implements OnClickListener, debugInfoText.append( getString(R.string.libopus_version, LibopusAudioTrackRenderer.getLibopusVersion())); debugInfoText.append("\n"); - debugInfoText.append(getString(R.string.current_path, filename)); + debugInfoText.append(getString(R.string.current_path, contentUri.toString())); debugInfoText.append(" "); debugInfoText.append(debugInfo); debugInfoText.append(" "); diff --git a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/SampleChooserActivity.java b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/SampleChooserActivity.java index c03c815277..1284c4dafb 100644 --- a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/SampleChooserActivity.java +++ b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/SampleChooserActivity.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer.demo.vp9opus; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -41,9 +42,6 @@ public class SampleChooserActivity extends Activity { ListView sampleList = (ListView) findViewById(R.id.sample_list); final SampleAdapter sampleAdapter = new SampleAdapter(this); - sampleAdapter.add(new Header("Local VP9 Video only")); - sampleAdapter.add(new Sample("S/W Color Conversion - upto 720p", false)); - sampleAdapter.add(new Sample("OpenGL", true)); sampleAdapter.add(new Header("DASH - VP9 Only")); sampleAdapter.add(new Sample("Google Glass", "http://demos.webmproject.org/dash/201410/vp9_glass/manifest_vp9.mpd")); @@ -67,9 +65,9 @@ public class SampleChooserActivity extends Activity { } private void onSampleSelected(Sample sample) { - Intent playerIntent = new Intent(this, VideoPlayer.class) - .putExtra(VideoPlayer.DASH_MANIFEST_URL_ID_EXTRA, sample.uri) - .putExtra(VideoPlayer.USE_OPENGL_ID_EXTRA, sample.useOpenGL); + Intent playerIntent = new Intent(this, PlayerActivity.class) + .setData(Uri.parse(sample.uri)) + .putExtra(PlayerActivity.USE_OPENGL_ID_EXTRA, sample.useOpenGL); startActivity(playerIntent); } diff --git a/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml b/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml index c6b2aea44d..176f28e6e6 100644 --- a/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml +++ b/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml @@ -40,33 +40,14 @@ - - -