2011年4月15日 星期五

MediaPlayer物件

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();
    }

沒有留言:

張貼留言