Home | History | Annotate | Download | only in media
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.apis.media;
     18 
     19 import com.example.android.apis.R;
     20 
     21 import android.app.Activity;
     22 import android.media.AudioManager;
     23 import android.media.MediaPlayer;
     24 import android.media.MediaPlayer.OnBufferingUpdateListener;
     25 import android.media.MediaPlayer.OnCompletionListener;
     26 import android.media.MediaPlayer.OnPreparedListener;
     27 import android.media.MediaPlayer.OnVideoSizeChangedListener;
     28 import android.os.Bundle;
     29 import android.util.Log;
     30 import android.view.SurfaceHolder;
     31 import android.view.SurfaceView;
     32 import android.widget.Toast;
     33 
     34 
     35 public class MediaPlayerDemo_Video extends Activity implements
     36         OnBufferingUpdateListener, OnCompletionListener,
     37         OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
     38 
     39     private static final String TAG = "MediaPlayerDemo";
     40     private int mVideoWidth;
     41     private int mVideoHeight;
     42     private MediaPlayer mMediaPlayer;
     43     private SurfaceView mPreview;
     44     private SurfaceHolder holder;
     45     private String path;
     46     private Bundle extras;
     47     private static final String MEDIA = "media";
     48     private static final int LOCAL_AUDIO = 1;
     49     private static final int STREAM_AUDIO = 2;
     50     private static final int RESOURCES_AUDIO = 3;
     51     private static final int LOCAL_VIDEO = 4;
     52     private static final int STREAM_VIDEO = 5;
     53     private boolean mIsVideoSizeKnown = false;
     54     private boolean mIsVideoReadyToBePlayed = false;
     55 
     56     /**
     57      *
     58      * Called when the activity is first created.
     59      */
     60     @Override
     61     public void onCreate(Bundle icicle) {
     62         super.onCreate(icicle);
     63         setContentView(R.layout.mediaplayer_2);
     64         mPreview = (SurfaceView) findViewById(R.id.surface);
     65         holder = mPreview.getHolder();
     66         holder.addCallback(this);
     67         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     68         extras = getIntent().getExtras();
     69 
     70     }
     71 
     72     private void playVideo(Integer Media) {
     73         doCleanUp();
     74         try {
     75 
     76             switch (Media) {
     77                 case LOCAL_VIDEO:
     78                     /*
     79                      * TODO: Set the path variable to a local media file path.
     80                      */
     81                     path = "";
     82                     if (path == "") {
     83                         // Tell the user to provide a media file URL.
     84                         Toast
     85                                 .makeText(
     86                                         MediaPlayerDemo_Video.this,
     87                                         "Please edit MediaPlayerDemo_Video Activity, "
     88                                                 + "and set the path variable to your media file path."
     89                                                 + " Your media file must be stored on sdcard.",
     90                                         Toast.LENGTH_LONG).show();
     91 
     92                     }
     93                     break;
     94                 case STREAM_VIDEO:
     95                     /*
     96                      * TODO: Set path variable to progressive streamable mp4 or
     97                      * 3gpp format URL. Http protocol should be used.
     98                      * Mediaplayer can only play "progressive streamable
     99                      * contents" which basically means: 1. the movie atom has to
    100                      * precede all the media data atoms. 2. The clip has to be
    101                      * reasonably interleaved.
    102                      *
    103                      */
    104                     path = "";
    105                     if (path == "") {
    106                         // Tell the user to provide a media file URL.
    107                         Toast
    108                                 .makeText(
    109                                         MediaPlayerDemo_Video.this,
    110                                         "Please edit MediaPlayerDemo_Video Activity,"
    111                                                 + " and set the path variable to your media file URL.",
    112                                         Toast.LENGTH_LONG).show();
    113 
    114                     }
    115 
    116                     break;
    117 
    118 
    119             }
    120 
    121             // Create a new media player and set the listeners
    122             mMediaPlayer = new MediaPlayer();
    123             mMediaPlayer.setDataSource(path);
    124             mMediaPlayer.setDisplay(holder);
    125             mMediaPlayer.prepare();
    126             mMediaPlayer.setOnBufferingUpdateListener(this);
    127             mMediaPlayer.setOnCompletionListener(this);
    128             mMediaPlayer.setOnPreparedListener(this);
    129             mMediaPlayer.setOnVideoSizeChangedListener(this);
    130             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    131 
    132 
    133         } catch (Exception e) {
    134             Log.e(TAG, "error: " + e.getMessage(), e);
    135         }
    136     }
    137 
    138     public void onBufferingUpdate(MediaPlayer arg0, int percent) {
    139         Log.d(TAG, "onBufferingUpdate percent:" + percent);
    140 
    141     }
    142 
    143     public void onCompletion(MediaPlayer arg0) {
    144         Log.d(TAG, "onCompletion called");
    145     }
    146 
    147     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    148         Log.v(TAG, "onVideoSizeChanged called");
    149         if (width == 0 || height == 0) {
    150             Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
    151             return;
    152         }
    153         mIsVideoSizeKnown = true;
    154         mVideoWidth = width;
    155         mVideoHeight = height;
    156         if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
    157             startVideoPlayback();
    158         }
    159     }
    160 
    161     public void onPrepared(MediaPlayer mediaplayer) {
    162         Log.d(TAG, "onPrepared called");
    163         mIsVideoReadyToBePlayed = true;
    164         if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
    165             startVideoPlayback();
    166         }
    167     }
    168 
    169     public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    170         Log.d(TAG, "surfaceChanged called");
    171 
    172     }
    173 
    174     public void surfaceDestroyed(SurfaceHolder surfaceholder) {
    175         Log.d(TAG, "surfaceDestroyed called");
    176     }
    177 
    178 
    179     public void surfaceCreated(SurfaceHolder holder) {
    180         Log.d(TAG, "surfaceCreated called");
    181         playVideo(extras.getInt(MEDIA));
    182 
    183 
    184     }
    185 
    186     @Override
    187     protected void onPause() {
    188         super.onPause();
    189         releaseMediaPlayer();
    190         doCleanUp();
    191     }
    192 
    193     @Override
    194     protected void onDestroy() {
    195         super.onDestroy();
    196         releaseMediaPlayer();
    197         doCleanUp();
    198     }
    199 
    200     private void releaseMediaPlayer() {
    201         if (mMediaPlayer != null) {
    202             mMediaPlayer.release();
    203             mMediaPlayer = null;
    204         }
    205     }
    206 
    207     private void doCleanUp() {
    208         mVideoWidth = 0;
    209         mVideoHeight = 0;
    210         mIsVideoReadyToBePlayed = false;
    211         mIsVideoSizeKnown = false;
    212     }
    213 
    214     private void startVideoPlayback() {
    215         Log.v(TAG, "startVideoPlayback");
    216         holder.setFixedSize(mVideoWidth, mVideoHeight);
    217         mMediaPlayer.start();
    218     }
    219 }
    220