Hi, About the MediaPlayer, I think the issue is that along with waiting for the surface being created, the start() method should be called when the MediaPlayer is prepared...
I tried moving the code around and it works the way you wanted it to: public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub Log.d(TAG, "surfaceCreated called"); mp.setDisplay(holder.getSurface()); try{ mp.prepare();} catch(Exception e){} mp.setOnBufferingUpdateListener(this); mp.setOnCompletionListener(this); mp.setOnPreparedListener(this); mp.setAudioStreamType(AudioSystem.STREAM_MUSIC); Log.d("\n\nCREATE", "mediaplayer"); } public void onPrepared(MediaPlayer mediaplayer) { Log.d(TAG, "onPrepared called" + mp.getDuration()); mp.start(); } Thanks, Megha On Sat, Apr 12, 2008 at 5:27 AM, Robert <[EMAIL PROTECTED]> wrote: > > > Unfortunately setting mSF to null had no influence. Some additional > info on what's happening: > > If I leave <SurfaceView> in my main.xml, the surface won't show the > video, but will contain the info what was displayed on it in the > subactivity. If I use <VideoView> in main.xml, the subactivity info is > erased, but the surface remains black. > > There are some rare occasions when a video is playing, but when I > return to the subactivty, and select the same file again, it no longer > plays in the main activity. > > I also tried with VideoView (in main.xml and Java code), with this: > > VideoView mVideoView = (VideoView)findViewById(R.id.preview); > mVideoView.setVideoURI(Uri.parse("file://" + data)); > mVideoView.setMediaController(new MediaController(this)); > mVideoView.requestFocus(); > > But, I experience the same thing, and additionally sometimes the app > crashes. > > Any other ideas to try out? > > Thanks, > Robert > > On Apr 12, 4:41 am, "Megha Joshi" <[EMAIL PROTECTED]> wrote: > > Hi Robert, > > > > What if you set mSF to null in surfaceDestroyed() call... Does that > help? > > > > Thanks, > > Megha > > > > On Fri, Apr 11, 2008 at 2:27 PM, Robert <[EMAIL PROTECTED]> wrote: > > > > > Hi Megha, > > > > > I am successfully using your classes to capture and view video files. > > > But, can't seem to reliable reuse the same surface when returning from > > > a subactivity. I tried playing a video file in onActivityResult(), and > > > although managed to play it on rare occasions, most of the time the > > > video is not shown. Since I've been running the same code over and > > > over again (and only sometimes successfully), I am assuming that the > > > surface is not ready to receive the video sequence. How can I make > > > sure surfaceCreated() has already done its job? Should I add something > > > to onResume() or onRestart() in my main activity? > > > > > The relevant code: > > > > > public class mediaclass extends Activity implements > > > SurfaceHolder.Callback { > > > private SurfaceView mSF; > > > private SurfaceHolder mHolder = null; > > > private boolean mHasSurface; > > > private MediaPlayer myPlayer; > > > > > @Override public void onCreate(Bundle icicle) { > > > super.onCreate(icicle); > > > setContentView(R.layout.main); > > > mSF = (SurfaceView) findViewById(R.id.preview); > > > mSF.getHolder().addCallback(this); > > > mHasSurface = false; > > > } > > > > > public void surfaceCreated(SurfaceHolder holder) { > > > mHolder = holder; > > > mHasSurface = true; > > > } > > > > > public void surfaceDestroyed(SurfaceHolder holder) { > > > mHolder = null; > > > mHasSurface = false; > > > } > > > > > @Override protected void onActivityResult(int requestCode, int > > > resultCode, String data, Bundle extras) { > > > super.onActivityResult(requestCode, resultCode, data, extras); > > > > > myPlayer = new MediaPlayer(); > > > if (mHasSurface == true){ > > > myPlayer.setDisplay(mHolder.getSurface()); > > > } > > > try { > > > myPlayer.setDataSource(data); // data contains the full > > > path/ > > > filename (from SD card) > > > myPlayer.prepare(); > > > } catch (IOException e) { > > > Log.e(TAG, e.getMessage(), e); > > > } > > > myPlayer.start(); > > > } > > > > > As you can see, I am checking mHasSurface, before attaching to the > > > surface. I even tried waiting for mHasSurface to become true in an > > > "infinite" loop, but no luck with that either :( What else can I try? > > > > > This is how the surface is defined in main.xml: > > > <SurfaceView > > > android:id="@+id/preview" > > > android:layout_width="176dip" > > > android:layout_height="144dip" > > > android:layout_alignParentTop="true" > > > android:layout_marginLeft="4px" > > > /> > > > > > Also can you suggest a way to display a PNG image from SD card on a > > > SurfaceView? Seems that MediaPlayer was not designed for this. > > > > > Thanks and regards > > > Robert > > > > > On Apr 8, 1:19 am, "Megha Joshi" <[EMAIL PROTECTED]> wrote: > > > > Hi, > > > > > > This is because the surface is not yet ready for the mediaplayer, > please > > > > call the mediaPlayer initialization code in or after > OnSurfaceCreate() > > > > callback.. > > > > > > Thanks, > > > > Megha > > > > > > On Mon, Apr 7, 2008 at 9:45 AM, fubin <[EMAIL PROTECTED]> wrote: > > > > > > > In Sample given by google There is a button to invoke a file. > > > > > private void playVideo(Integer Media) { > > > > > try { > > > > > // If the path has not changed, just start the media > > > > > player > > > > > path = "/data/room.mp4"; > > > > > > > // Create a new media player and set the listeners > > > > > mp = new MediaPlayer(); > > > > > mp.setDataSource(path); > > > > > mp.setDisplay(holder.getSurface()); > > > > > mp.prepare(); > > > > > mp.setOnBufferingUpdateListener(this); > > > > > mp.setOnCompletionListener(this); > > > > > mp.setOnPreparedListener(this); > > > > > mp.setAudioStreamType(AudioSystem.STREAM_MUSIC); > > > > > Log.d("\n\nCREATE", "mediaplayer"); > > > > > mp.start(); > > > > > } catch (Exception e) { > > > > > Log.e(TAG, "error: " + e.getMessage(), e); > > > > > } > > > > > } > > > > > > > private OnClickListener mPlayListener = new OnClickListener() { > > > > > public void onClick(View v) { > > > > > playVideo(extras.getInt(MEDIA)); > > > > > > > } > > > > > }; > > > > > > > When I copy the code directly to onCreate like the following > program > > > > > creshed...: > > > > > > > public void onCreate(Bundle icicle) { > > > > > super.onCreate(icicle); > > > > > setContentView(R.layout.mediaplayer); > > > > > mPreview = (SurfaceView) findViewById(R.id.surface); > > > > > > > // Set the transparency > > > > > getWindow().setFormat(PixelFormat.TRANSPARENT); > > > > > // Set a size for the video screen > > > > > holder = mPreview.getHolder(); > > > > > holder.addCallback(this); > > > > > try { > > > > > // If the path has not changed, just start the media > > > > > player > > > > > path = "/data/room.mp4"; > > > > > > > // Create a new media player and set the listeners > > > > > mp = new MediaPlayer(); > > > > > mp.setDataSource(path); > > > > > mp.setDisplay(holder.getSurface()); > > > > > mp.prepare(); > > > > > mp.setOnBufferingUpdateListener(this); > > > > > > > mp.setOnCompletionListener(this); > > > > > mp.setOnPreparedListener(this); > > > > > mp.setAudioStreamType(AudioSystem.STREAM_MUSIC); > > > > > Log.d("\n\nCREATE", "mediaplayer"); > > > > > mp.start(); > > > > > } catch (Exception e) { > > > > > Log.e(TAG, "error: " + e.getMessage(), e); > > > > > } > > > > > } > > > > > > > There is no error information for debug. > > > > > Anyone have the same problem? > > > > > Thanks in advance. > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] Announcing the new M5 SDK! http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---