MediaPlayer物件
Audio Play
使用MediaPlayer物件撥放聲音,可以從不同的來源設定,其使用的方式也不相同。
1. 本地端(包含在APK裡的檔案)
private MediaPlayer mediaPlayer = null;
// Start Play Audio
private OnClickListener start = new OnClickListener() {
public void onClick(View v) {
// 直接從本地端讀取音源檔
mediaPlayer = MediaPlayer.create(AudioPlay.this, R.raw.test);
try {
mediaPlayer.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
btn_start.setEnabled(false);
btn_stop.setEnabled(true);
}
};
// Stop Play Audio
private OnClickListener stop = new OnClickListener() {
public void onClick(View v) {
mediaPlayer.stop();
// 結束時把控制全釋放,避免占用資源
mediaPlayer.release();
mediaPlayer = null;
btn_start.setEnabled(true);
btn_stop.setEnabled(false);
}
};
// 銷毀,當不正常結束的情形發生時的處理動作
public void onDestroy() {
super.onDestroy();
// 避免物件為"空"時,使用屬性發生錯誤
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
2. 外部裝置或路徑
// Use sd card resource
bplay.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
try {
mp.setDataSource("/sdcard/Christina - Fighter.mp3");
mp.prepare();
mp.start();
bmsg.setText("Playing...");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
Video Play
撥放影音需用到SurfaceView物件
main.xml <SurfaceView
android:id="@+id/surface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
Xxx.java
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
// 初始化,並設定holder
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
// 初始化及設定MediaPlayer物件
private void playVideo() {
doCleanUp();
try {
path = "/sdcard/test.mp4";
// 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) {
}
}
// Called to update status in buffering a media stream(非必要)
public void onBufferingUpdate(MediaPlayer arg0, int percent) { }
// 當影片播放結束,進入onCompletion狀態(非必要)
// 若是要重複播放,可以參考下列流程控制
// 或是在playVideo加入"mMediaPlayer.setLooping(true)"
public void onCompletion(MediaPlayer arg0) {
mMediaPlayer.stop();
try {
mMediaPlayer.prepare();
}
catch (IllegalStateException e) { }
catch (IOException e) { }
mMediaPlayer.start();
}
// 讀取影片畫面大小
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
if (width == 0 || height == 0) {
return;
}
mIsVideoSizeKnown = true;
mVideoWidth = width;
mVideoHeight = height;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}
// 準備狀態
public void onPrepared(MediaPlayer mediaplayer) {
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}
// for "SurfaceHolder.Callback" use
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { }
public void surfaceDestroyed(SurfaceHolder surfaceholder) { }
public void surfaceCreated(SurfaceHolder holder) {
playVideo();
}
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;
}
// strat to play
private void startVideoPlayback() {
holder.setFixedSize(mVideoWidth, mVideoHeight);
mMediaPlayer.start();
}
沒有留言:
張貼留言