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
17package com.example.android.apis.media;
18
19import com.example.android.apis.R;
20
21import android.app.Activity;
22import android.media.AudioManager;
23import android.media.MediaPlayer;
24import android.media.MediaPlayer.OnBufferingUpdateListener;
25import android.media.MediaPlayer.OnCompletionListener;
26import android.media.MediaPlayer.OnPreparedListener;
27import android.media.MediaPlayer.OnVideoSizeChangedListener;
28import android.os.Bundle;
29import android.util.Log;
30import android.view.SurfaceHolder;
31import android.view.SurfaceView;
32import android.widget.Toast;
33
34
35public 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