package
video.demo;
/*
* 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.
*/
import
android.app.Activity;
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;
public
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
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.mediaplayer_2); mPreview
=
(SurfaceView) findViewById(R.id.surface); holder
=
mPreview.getHolder(); holder.addCallback(
this
); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }
private
void
playVideo() { doCleanUp();
try
{
/*
* 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
=
"
http://www.androidbook.com/akc/filestorage/android/documentfiles/3389/movie.mp4
"
; path
=
"
http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp
"
;
//
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(); } @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(); } }
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<
SurfaceView
android:id
="@+id/surface"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:layout_gravity
="center"
>
</
SurfaceView
>
</
LinearLayout
>