目前日期文章:201110 (4)

瀏覽方式: 標題列表 簡短摘要

使用 SurfaceView + MediaPlayer 有幾項要注意的重點,不然是無法順利播放影片。

  • MediaPlayer.setDisplay(SurfaceHolder) 必須在 surfaceCreated 之後才能執行,不然只會聽到聲音看不到影像。
  • SurfaceHolder.setType() 必須設定成 SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS,否則播放會出錯。
  • SurfaceHolder.setType() 必須在 surfaceCreated 之前設定完成,不然只會聽到聲音看不到影像。。
  • MediaPlayer.setDisplay() 不一定要在 MediaPlayer.start() 前面,隨時都可以變更。
  • MediaPlayer.setDataSource() 可以輸入網址或是檔案路徑。
  • 如果要重覆撥放,需要設定 OnCompletionListener,在 onCompletion 放一個 mediaPlayer.start() 即可。
  • 如果撥完要撥另一個檔案,則需要先下 reset() 進入 IDLE stage,才能再用 setDataSource(),不然會出現 error stage 的錯誤訊息。
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class VideoTestActivity extends Activity {

    MediaPlayer mediaPlayer;
    SurfaceView surfaceView;
    SurfaceHolder surfaceHolder;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        surfaceView = new SurfaceView(this);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        setContentView(surfaceView);

        mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource("/mnt/sdcard/video/video2.3gp");
            mediaPlayer.prepare();
        } catch (Exception e) {
        }
        mediaPlayer.start();

        mediaPlayer.setOnCompletionListener(
            new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    try {
                        mp.reset();
                        mp.setDataSource("/mnt/sdcard/video/video1.3gp");
                        mp.prepare();
                    } catch (Exception e) {
                    }
                    // repeat play 只要下 start()
                    mp.start();
                }
            });

        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
                Log.e("video","surfaceChanged");
            }
            @Override
            public void surfaceCreated(SurfaceHolder arg0) {
                Log.e("video","surfaceCreated");
                mediaPlayer.setDisplay(surfaceHolder);
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder arg0) {
                Log.e("video","surfaceDestroyed");
                if (mediaPlayer != null) mediaPlayer.release();
            }
        });
    }
}

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

一般要取得 android 營幕的解析度大小,可以藉由 Activity.getWindowManager().getDefaultDisplay() 先取得 Display 物件,再利用 Display 來取得 height 及 width。但是這個尺吋不是 layout 真正的尺寸,android API 也說了,因為還有一些裝飾(如 status bar),所以 layout 的尺寸會小一點。

那要如何取得 layout 真正的尺寸大小呢?由於 layout 也是繼承於 View,所以可以藉由 getHeigth 及 getWidth 來取得,但是一開始初始化時,所取得的值卻為 0。原因就出在 layout 一開始並沒有計算尺寸大小,而是在後面重新安排元件位置時才會計算。但是在那一個過程才能取得 layout 實際大小呢?

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

瑪利亞小圖.jpg  

秋天來了,瑪利亞孩子即將過冬

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

打開 sdcard File Explorer

  • 第一要先啟動一台 Android Virtual Device(AVD),這樣才能知道要設定那一台的 sdcard。
  • Window → Open Perspective → DDMS,設定 DDMS 顯示。

    sdcard.jpg
  • 接著 DDMS 就會出現在 eclipse 右上角,點擊 DDMS 就會看到 File Explorer。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()