From e3b897f4b5e0f07db9fc66be0ed05f4cda7f7a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 2 Oct 2012 13:31:39 +0200 Subject: [PATCH] Add support for selecting files --- .../android-tutorial-1/jni/tutorial-1.c | 3 + .../android-tutorial-1/res/layout/main.xml | 10 +++- .../android-tutorial-1/res/values/strings.xml | 1 + .../tutorial_1/Tutorial1.java | 58 ++++++++++++++----- 4 files changed, 58 insertions(+), 14 deletions(-) diff --git a/gst-sdk/tutorials/android-tutorial-1/jni/tutorial-1.c b/gst-sdk/tutorials/android-tutorial-1/jni/tutorial-1.c index df74084563..7ff846aa1f 100755 --- a/gst-sdk/tutorials/android-tutorial-1/jni/tutorial-1.c +++ b/gst-sdk/tutorials/android-tutorial-1/jni/tutorial-1.c @@ -345,8 +345,11 @@ void gst_native_set_uri (JNIEnv* env, jobject thiz, jstring uri) { if (!data) return; const jbyte *char_uri = (*env)->GetStringUTFChars (env, uri, NULL); GST_DEBUG ("Setting URI to %s", char_uri); + if (data->target_state >= GST_STATE_READY) + gst_element_set_state (data->pipeline, GST_STATE_READY); g_object_set(data->pipeline, "uri", char_uri); (*env)->ReleaseStringUTFChars (env, uri, char_uri); + data->is_live = (gst_element_set_state (data->pipeline, data->target_state) == GST_STATE_CHANGE_NO_PREROLL); } void gst_native_play (JNIEnv* env, jobject thiz) { diff --git a/gst-sdk/tutorials/android-tutorial-1/res/layout/main.xml b/gst-sdk/tutorials/android-tutorial-1/res/layout/main.xml index 4c3e1000c2..c3baac85a6 100755 --- a/gst-sdk/tutorials/android-tutorial-1/res/layout/main.xml +++ b/gst-sdk/tutorials/android-tutorial-1/res/layout/main.xml @@ -29,6 +29,14 @@ android:contentDescription="@string/button_stop" android:src="@android:drawable/ic_media_pause" android:text="@string/button_stop" /> + + - \ No newline at end of file + diff --git a/gst-sdk/tutorials/android-tutorial-1/res/values/strings.xml b/gst-sdk/tutorials/android-tutorial-1/res/values/strings.xml index 60c84d95a7..b79c80827b 100755 --- a/gst-sdk/tutorials/android-tutorial-1/res/values/strings.xml +++ b/gst-sdk/tutorials/android-tutorial-1/res/values/strings.xml @@ -3,4 +3,5 @@ Android tutorial 1 Play Stop + Select diff --git a/gst-sdk/tutorials/android-tutorial-1/src/com/gst_sdk_tutorials/tutorial_1/Tutorial1.java b/gst-sdk/tutorials/android-tutorial-1/src/com/gst_sdk_tutorials/tutorial_1/Tutorial1.java index 666a77dcaf..5243b84e43 100755 --- a/gst-sdk/tutorials/android-tutorial-1/src/com/gst_sdk_tutorials/tutorial_1/Tutorial1.java +++ b/gst-sdk/tutorials/android-tutorial-1/src/com/gst_sdk_tutorials/tutorial_1/Tutorial1.java @@ -22,8 +22,13 @@ import java.util.TimeZone; import com.gst_sdk.GStreamer; import android.app.Activity; +import android.content.Intent; +import android.database.Cursor; import android.util.Log; +import android.net.Uri; import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; @@ -54,10 +59,11 @@ public class Tutorial1 extends Activity implements SurfaceHolder.Callback, OnSee private Bundle initialization_data; - private final String mediaUri = "http://docs.gstreamer.com/media/sintel_trailer-480p.ogv"; - - /* Called when the activity is first created. - @Override */ + private String mediaUri = "http://docs.gstreamer.com/media/sintel_trailer-480p.ogv"; + static private final int PICK_FILE_CODE = 1; + + /* Called when the activity is first created. */ + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -87,6 +93,15 @@ public class Tutorial1 extends Activity implements SurfaceHolder.Callback, OnSee nativePause(); } }); + + ImageButton select = (ImageButton) this.findViewById(R.id.button_select); + select.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + Intent i = new Intent(Intent.ACTION_PICK); + i.setDataAndType(Uri.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)), "video/*;audio/*"); + startActivityForResult(i, PICK_FILE_CODE); + } + }); SurfaceView sv = (SurfaceView) this.findViewById(R.id.surface_video); SurfaceHolder sh = sv.getHolder(); @@ -104,10 +119,11 @@ public class Tutorial1 extends Activity implements SurfaceHolder.Callback, OnSee } protected void onSaveInstanceState (Bundle outState) { - Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired + " position:" + position); + Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired + " position:" + position + " uri: " + mediaUri); outState.putBoolean("playing", is_playing_desired); outState.putInt("position", position); outState.putInt("duration", duration); + outState.putString("mediaUri", mediaUri); } protected void onDestroy() { @@ -124,27 +140,30 @@ public class Tutorial1 extends Activity implements SurfaceHolder.Callback, OnSee } }); } - - /* Called from native code */ - private void onGStreamerInitialized () { + + private void setMediaUri() { nativeSetUri (mediaUri); if (mediaUri.startsWith("file://")) is_local_media = true; + } + /* Called from native code */ + private void onGStreamerInitialized () { if (initialization_data != null) { is_playing_desired = initialization_data.getBoolean("playing"); int milliseconds = initialization_data.getInt("position"); Log.i ("GStreamer", "Restoring state, playing:" + is_playing_desired + " position:" + milliseconds + " ms."); + mediaUri = initialization_data.getString ("mediaUri"); /* Actually, move to one millisecond in the future. Otherwise, due to rounding errors between the * milliseconds used here and the nanoseconds used by GStreamer, we would be jumping a bit behind * where we were before. This, combined with seeking to keyframe positions, would skip one keyframe * backwards on each iteration. */ nativeSetPosition(milliseconds + 1); - if (is_playing_desired) { - nativePlay(); - } else { - nativePause(); - } + } + + setMediaUri (); + if (is_playing_desired) { + nativePlay(); } else { nativePause(); } @@ -244,4 +263,17 @@ public class Tutorial1 extends Activity implements SurfaceHolder.Callback, OnSee if (!is_local_media) nativeSetPosition(desired_position); if (is_playing_desired) nativePlay(); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + if (resultCode == RESULT_OK && requestCode == PICK_FILE_CODE) { + String[] proj = { MediaStore.Video.Media.DATA }; + Cursor c = managedQuery(data.getData(), proj, null, null, null); + int column_index = c.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); + c.moveToFirst(); + mediaUri = "file://" + c.getString(column_index); + setMediaUri(); + } + } }