
MediaPlayer可以播放video與audio檔案
播放video檔案必須先準備一個播放畫面
SurfaceView支援高速繪圖,適合用來呈現video的播放、拍照前的預覽
雖然SurfaceView是主要呈現畫面的地方,但是控制內部surface運作的卻是SurfaceHolder
SurfaceHolder.Callback介面定義了與surface生命週期有關的3個重要
方法: surfaceCreated() surface第一次建立時呼叫 surfaceChanged() surface改變時呼叫 surfaceDestroyed() surface被破壞時呼叫
1.設計Ch9_4_MediaPlay_SurfaceView.java
- package com.example.ch9_4_mediaplay_surfaceview;
- import java.io.IOException;
- 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.app.Activity;
- import android.util.Log;
- import android.view.Menu;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class Ch9_4_MediaPlay_SurfaceView extends Activity {
- SurfaceView sv;
- SurfaceHolder sh;
- int videowidth;
- int videoheight;
- boolean videoReady=false;
- boolean videoSize=false;
- MediaPlayer mp;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- sv=(SurfaceView)findViewById(R.id.surfaceView1);
- sh=sv.getHolder();
- sh.addCallback(new surfaceCallback());
- }
- class surfaceCallback implements SurfaceHolder.Callback {
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- videowidth=0;
- videoheight=0;
- videoReady=false;
- videoSize=false;
- if(mp ==null)
- mp=new MediaPlayer();
- try {
- mp.setDataSource("/mnt/sdcard/baby.mp4");
- mp.setDisplay(sh);
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.prepare();
- //mp.start();
- mp.setOnBufferingUpdateListener(new OnBufferingUpdateListener(){
- @Override
- public void onBufferingUpdate(MediaPlayer mp,
- int percent) {
- Log.d("ch9_4","緩衝區更新比例"+percent);
- }});
- mp.setOnCompletionListener(new OnCompletionListener(){
- @Override
- public void onCompletion(MediaPlayer mp) {
- Log.d("ch9_4","播放完畢!");
- }});
- mp.setOnPreparedListener(new OnPreparedListener(){
- @Override
- public void onPrepared(MediaPlayer mp) {
- videoReady=true;
- if(videoSize){
- sh.setFixedSize(videowidth, videoheight);
- mp.start();
- }
- }});
- mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener(){
- @Override
- public void onVideoSizeChanged(MediaPlayer mp,
- int width, int height) {
- if(width==0 ||height==0)
- Log.e("C9_4", "Video的寬度或高度有異常");
- videoSize=true;
- videowidth=width;
- videoheight=height;
- if(videoReady){
- sh.setFixedSize(videowidth, videoheight);
- mp.start();
- }
- }});
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.d("Ch9_4","surfaceCreated被呼叫!");
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- if(mp !=null){
- mp.release();
- mp=null;
- }
- videowidth=0;
- videoheight=0;
- videoReady=false;
- videoSize=false;
- }
- }
- }
復制代碼
|