標籤:android des style blog class code
播放視頻的兩種方式:
使用VideoView播放視頻(方便,推薦)
使用MediaPlayer和SurfaceView播放視頻(早期的方式)
第一種方式:
使用VideoView播放視頻的步驟如下:
在介面布局檔案中定義VideoView組件,或在程式中建立VideoView組建
調用VideoView的如下兩個方法載入指定視頻
setVideoPath(String paht):載入path檔案所代表的視頻
setVideoURI(URI uri):載入uri所對應的視頻
調用VideoVIew的start(),stop(),pause()方法來控制視頻播放
MediaContraller類
與VideoView一起結合使用的還有一個MediaContraller類,它的作用時提供一個友好的圖形控制介面,通過該控制介面來控制視頻的播放,快進鍵,暫停鍵,後退鍵以及播放進度
條都是該類提供
例子代碼:
xml布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 定義VideoView播放視頻 --><VideoViewandroid:id="@+id/video"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
Activity:
import java.io.File;import android.app.Activity;import android.graphics.PixelFormat;import android.os.Bundle;import android.widget.MediaController;import android.widget.VideoView;public class VedioViewTest extends Activity { VideoView videoView; MediaController mController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.main); // 擷取介面上VideoView組件 videoView = (VideoView) findViewById(R.id.video); // 建立MediaController對象 mController = new MediaController(this); File video = new File("/mnt/sdcard/movie.mp4"); if (video.exists()) { videoView.setVideoPath(video.getAbsolutePath()); //① // 設定videoView與mController建立關聯 videoView.setMediaController(mController); //② // 設定mController與videoView建立關聯 mController.setMediaPlayer(videoView); //③ // 讓VideoView擷取焦點 videoView.requestFocus(); } }}
第二種方式:
使用MediaPlayer播放視頻的步驟如下:
建立MediaPlayer對象,並讓它載入指定的視頻檔案
在介面布局檔案中定義SurfaceView組件,或在程式中建立SurfaceView組件,並為SurfaceView的SurfaceView的SurfaceHolder增加Callback監聽器
調用 MediaPlayer對象的setPisplay(SurfaceHolder sh):將所播放的視頻映像輸出到指定的SurfaceView組件
調用MediaPlayer對象的start(),stop(),和pause()方法來控制視頻的播放
例子代碼:
xml布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" ><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent" android:layout_height="360dp"/><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:gravity="center_horizontal"><ImageButtonandroid:id="@+id/play"android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play" /><ImageButton android:id="@+id/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/pause" /><ImageButtonandroid:id="@+id/stop"android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stop"/></LinearLayout></RelativeLayout>
Activity:
import java.io.IOException;import android.app.Activity;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.RelativeLayout.LayoutParams;import android.widget.ImageButton;public class SurfaceViewPlayVideo extends Activityimplements OnClickListener{SurfaceView surfaceView;ImageButton play, pause, stop;MediaPlayer mPlayer;// 記錄當前視頻的播放位置int position;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 擷取介面中的3個按鈕play = (ImageButton) findViewById(R.id.play);pause = (ImageButton) findViewById(R.id.pause);stop = (ImageButton) findViewById(R.id.stop);// 為3個按鈕的單擊事件綁定事件監聽器play.setOnClickListener(this);pause.setOnClickListener(this);stop.setOnClickListener(this);// 建立MediaPlayermPlayer = new MediaPlayer();surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);// 設定播放時開啟螢幕surfaceView.getHolder().setKeepScreenOn(true);surfaceView.getHolder().addCallback(new SurfaceListener());}@Overridepublic void onClick(View source){try{switch (source.getId()){// 播放按鈕被單擊case R.id.play:play();break;// 暫停按鈕被單擊case R.id.pause:if (mPlayer.isPlaying()){mPlayer.pause();}else{mPlayer.start();}break;// 停止按鈕被單擊case R.id.stop:if (mPlayer.isPlaying()) mPlayer.stop();break;}}catch (Exception e){e.printStackTrace();}}private void play() throws IOException{mPlayer.reset();mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 設定需要播放的視頻mPlayer.setDataSource("/mnt/sdcard/movie.3gp");// 把視頻畫面輸出到SurfaceViewmPlayer.setDisplay(surfaceView.getHolder()); //①mPlayer.prepare();// 擷取視窗管理器WindowManager wManager = getWindowManager();DisplayMetrics metrics = new DisplayMetrics();// 擷取螢幕大小wManager.getDefaultDisplay().getMetrics(metrics);// 設定視頻保持縱橫比縮放到佔滿整個螢幕surfaceView.setLayoutParams(new LayoutParams(metrics.widthPixels, mPlayer.getVideoHeight() * metrics.widthPixels/ mPlayer.getVideoWidth()));mPlayer.start();}private class SurfaceListener implements SurfaceHolder.Callback{@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height){}@Overridepublic void surfaceCreated(SurfaceHolder holder){if (position > 0){try{// 開始播放play();// 並直接從指定位置開始播放mPlayer.seekTo(position);position = 0;}catch (Exception e){e.printStackTrace();}}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder){}}// 當其他Activity被開啟,暫停播放@Overrideprotected void onPause(){if (mPlayer.isPlaying()){// 儲存當前的播放位置position = mPlayer.getCurrentPosition();mPlayer.stop();}super.onPause();}@Overrideprotected void onDestroy(){// 停止播放if (mPlayer.isPlaying()) mPlayer.stop();// 釋放資源mPlayer.release();super.onDestroy();}}