Mega Code Archive

 
Categories / Android / Media
 

Using MediaPlayer to play Video and Audio

/*  * Copyright (C) 2009 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package com.example.android.apis.media; import android.app.Activity; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnVideoSizeChangedListener; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; class MediaPlayerDemo_Audio extends Activity {   private static final String TAG = "MediaPlayerDemo";   private MediaPlayer mMediaPlayer;   private static final String MEDIA = "media";   private static final int LOCAL_AUDIO = 1;   private static final int STREAM_AUDIO = 2;   private static final int RESOURCES_AUDIO = 3;   private static final int LOCAL_VIDEO = 4;   private static final int STREAM_VIDEO = 5;   private String path;   private TextView tx;   @Override   public void onCreate(Bundle icicle) {     super.onCreate(icicle);     tx = new TextView(this);     setContentView(tx);     Bundle extras = getIntent().getExtras();     playAudio(extras.getInt(MEDIA));   }   private void playAudio(Integer media) {     try {       switch (media) {       case LOCAL_AUDIO:         /**          * TODO: Set the path variable to a local audio file path.          */         path = "";         if (path == "") {           // Tell the user to provide an audio file URL.           Toast.makeText(               MediaPlayerDemo_Audio.this,               "Please edit MediaPlayer_Audio Activity, "                   + "and set the path variable to your audio file path."                   + " Your audio file must be stored on sdcard.",               Toast.LENGTH_LONG).show();         }         mMediaPlayer = new MediaPlayer();         mMediaPlayer.setDataSource(path);         mMediaPlayer.prepare();         mMediaPlayer.start();         break;       case RESOURCES_AUDIO:         /**          * TODO: Upload a audio file to res/raw folder and provide its          * resid in MediaPlayer.create() method.          */         mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);//test_cbr.mp3         mMediaPlayer.start();       }       tx.setText("Playing audio...");     } catch (Exception e) {       Log.e(TAG, "error: " + e.getMessage(), e);     }   }   @Override   protected void onDestroy() {     super.onDestroy();     // TODO Auto-generated method stub     if (mMediaPlayer != null) {       mMediaPlayer.release();       mMediaPlayer = null;     }   } } class MediaPlayerDemo_Video extends Activity implements     OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,     OnVideoSizeChangedListener, SurfaceHolder.Callback {   private static final String TAG = "MediaPlayerDemo";   private int mVideoWidth;   private int mVideoHeight;   private MediaPlayer mMediaPlayer;   private SurfaceView mPreview;   private SurfaceHolder holder;   private String path;   private Bundle extras;   private static final String MEDIA = "media";   private static final int LOCAL_AUDIO = 1;   private static final int STREAM_AUDIO = 2;   private static final int RESOURCES_AUDIO = 3;   private static final int LOCAL_VIDEO = 4;   private static final int STREAM_VIDEO = 5;   private boolean mIsVideoSizeKnown = false;   private boolean mIsVideoReadyToBePlayed = false;   /**    *     * Called when the activity is first created.    */   @Override   public void onCreate(Bundle icicle) {     super.onCreate(icicle);     setContentView(R.layout.row);     mPreview = (SurfaceView) findViewById(R.id.surface);     holder = mPreview.getHolder();     holder.addCallback(this);     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     extras = getIntent().getExtras();   }   private void playVideo(Integer Media) {     doCleanUp();     try {       switch (Media) {       case LOCAL_VIDEO:         /*          * TODO: Set the path variable to a local media file path.          */         path = "";         if (path == "") {           // Tell the user to provide a media file URL.           Toast.makeText(               MediaPlayerDemo_Video.this,               "Please edit MediaPlayerDemo_Video Activity, "                   + "and set the path variable to your media file path."                   + " Your media file must be stored on sdcard.",               Toast.LENGTH_LONG).show();         }         break;       case STREAM_VIDEO:         /*          * TODO: Set path variable to progressive streamable mp4 or 3gpp          * format URL. Http protocol should be used. Mediaplayer can          * only play "progressive streamable contents" which basically          * means: 1. the movie atom has to precede all the media data          * atoms. 2. The clip has to be reasonably interleaved.          */         path = "";         if (path == "") {           // Tell the user to provide a media file URL.           Toast.makeText(               MediaPlayerDemo_Video.this,               "Please edit MediaPlayerDemo_Video Activity,"                   + " and set the path variable to your media file URL.",               Toast.LENGTH_LONG).show();         }         break;       }       // Create a new media player and set the listeners       mMediaPlayer = new MediaPlayer();       mMediaPlayer.setDataSource(path);       mMediaPlayer.setDisplay(holder);       mMediaPlayer.prepare();       mMediaPlayer.setOnBufferingUpdateListener(this);       mMediaPlayer.setOnCompletionListener(this);       mMediaPlayer.setOnPreparedListener(this);       mMediaPlayer.setOnVideoSizeChangedListener(this);       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);     } catch (Exception e) {       Log.e(TAG, "error: " + e.getMessage(), e);     }   }   public void onBufferingUpdate(MediaPlayer arg0, int percent) {     Log.d(TAG, "onBufferingUpdate percent:" + percent);   }   public void onCompletion(MediaPlayer arg0) {     Log.d(TAG, "onCompletion called");   }   public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {     Log.v(TAG, "onVideoSizeChanged called");     if (width == 0 || height == 0) {       Log.e(TAG, "invalid video width(" + width + ") or height(" + height           + ")");       return;     }     mIsVideoSizeKnown = true;     mVideoWidth = width;     mVideoHeight = height;     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {       startVideoPlayback();     }   }   public void onPrepared(MediaPlayer mediaplayer) {     Log.d(TAG, "onPrepared called");     mIsVideoReadyToBePlayed = true;     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {       startVideoPlayback();     }   }   public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {     Log.d(TAG, "surfaceChanged called");   }   public void surfaceDestroyed(SurfaceHolder surfaceholder) {     Log.d(TAG, "surfaceDestroyed called");   }   public void surfaceCreated(SurfaceHolder holder) {     Log.d(TAG, "surfaceCreated called");     playVideo(extras.getInt(MEDIA));   }   @Override   protected void onPause() {     super.onPause();     releaseMediaPlayer();     doCleanUp();   }   @Override   protected void onDestroy() {     super.onDestroy();     releaseMediaPlayer();     doCleanUp();   }   private void releaseMediaPlayer() {     if (mMediaPlayer != null) {       mMediaPlayer.release();       mMediaPlayer = null;     }   }   private void doCleanUp() {     mVideoWidth = 0;     mVideoHeight = 0;     mIsVideoReadyToBePlayed = false;     mIsVideoSizeKnown = false;   }   private void startVideoPlayback() {     Log.v(TAG, "startVideoPlayback");     holder.setFixedSize(mVideoWidth, mVideoHeight);     mMediaPlayer.start();   } } public class Test extends Activity {   private Button mlocalvideo;   private Button mresourcesvideo;   private Button mstreamvideo;   private Button mlocalaudio;   private Button mresourcesaudio;   private Button mstreamaudio;   private static final String MEDIA = "media";   private static final int LOCAL_AUDIO = 1;   private static final int STREAM_AUDIO = 2;   private static final int RESOURCES_AUDIO = 3;   private static final int LOCAL_VIDEO = 4;   private static final int STREAM_VIDEO = 5;   private static final int RESOURCES_VIDEO = 6;   @Override   protected void onCreate(Bundle icicle) {     // TODO Auto-generated method stub     super.onCreate(icicle);     setContentView(R.layout.main);     mlocalaudio = (Button) findViewById(R.id.localaudio);     mlocalaudio.setOnClickListener(mLocalAudioListener);     mresourcesaudio = (Button) findViewById(R.id.resourcesaudio);     mresourcesaudio.setOnClickListener(mResourcesAudioListener);     mlocalvideo = (Button) findViewById(R.id.localvideo);     mlocalvideo.setOnClickListener(mLocalVideoListener);     mstreamvideo = (Button) findViewById(R.id.streamvideo);     mstreamvideo.setOnClickListener(mStreamVideoListener);   }   private OnClickListener mLocalAudioListener = new OnClickListener() {     public void onClick(View v) {       Intent intent = new Intent(Test.this.getApplication(),           MediaPlayerDemo_Audio.class);       intent.putExtra(MEDIA, LOCAL_AUDIO);       startActivity(intent);     }   };   private OnClickListener mResourcesAudioListener = new OnClickListener() {     public void onClick(View v) {       Intent intent = new Intent(Test.this.getApplication(),           MediaPlayerDemo_Audio.class);       intent.putExtra(MEDIA, RESOURCES_AUDIO);       startActivity(intent);     }   };   private OnClickListener mLocalVideoListener = new OnClickListener() {     public void onClick(View v) {       Intent intent = new Intent(Test.this,           MediaPlayerDemo_Video.class);       intent.putExtra(MEDIA, LOCAL_VIDEO);       startActivity(intent);     }   };   private OnClickListener mStreamVideoListener = new OnClickListener() {     public void onClick(View v) {       Intent intent = new Intent(Test.this,           MediaPlayerDemo_Video.class);       intent.putExtra(MEDIA, STREAM_VIDEO);       startActivity(intent);     }   }; } //main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="match_parent"     android:layout_height="match_parent"     >     <Button android:id="@+id/localvideo"         android:layout_height="wrap_content"         android:layout_width="match_parent"          android:text="local_video"      />          <Button android:id="@+id/streamvideo"         android:layout_height="wrap_content"         android:layout_width="match_parent"          android:text="stream_video"      />          <Button android:id="@+id/localaudio"         android:layout_height="wrap_content"         android:layout_width="match_parent"          android:text="local_audio"      />          <Button android:id="@+id/resourcesaudio"         android:layout_height="wrap_content"         android:layout_width="match_parent"          android:text="res_audio"      />      </LinearLayout> //row.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical"     android:layout_width="match_parent"     android:layout_height="match_parent">     <SurfaceView android:id="@+id/surface"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="center">     </SurfaceView>    </LinearLayout>