一、Android 視頻播放的幾種方法
1、VideoView 播放組件
(1)佈局xml中添加VideoView組件
<VideoView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/VideoView"
/>
(2)AndroidManifest文件
添加訪問sd卡權限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
橫屏 android:screenOrientation="landscape"
去掉ActionBar android:theme="@style/Theme.AppCompat.Light.NoActionBar"
(3)MainActivity.java
public class MainActivity extends Activity {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.VideoView);
videoView.setVideoPath("/mnt/shared/other/family.mp4"); //設置視頻路徑
videoView.start();
MediaController mediaController = new MediaController(MainActivity.this,true); //設置控制器
videoView.setMediaController(mediaController); //用控制器初始化videoview
}
}
2、MediaPlayer + SurfaceView
(1)視頻文件ocean.mp4放置於res目錄下的raw目錄中,由於surfaceView的創建需要一定的時間,因此調用addCallback,在其創建完成時,播放器設置播放幕布並進行播放。
(2)佈局XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/surfaceView"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暫停"
android:id="@+id/pause"
android:layout_alignParentBottom="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:id="@+id/play"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
(3)MainActivity.Java
public class MainActivity extends Activity {
private SurfaceView surfaceView; //播放幕布
private MediaPlayer mediaPlayer; //播放器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceView);
mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.ocean);
//surfaceView的創建需要一定的時間
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
findViewById(R.id.pause).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.pause();
}
});
findViewById(R.id.play).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mediaPlayer.start();
}
});
}
}
3、MediaPlayer + SurfaceView + MediaController
(1)佈局XML
只有一個SurfaceView組件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/root">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/surfaceView"
/>
</RelativeLayout>
(2)MainActivity.java
自己定義MediaController,相當於將MediaPlayer 的控制交給MediaController。
public class MainActivity extends Activity implements MediaController.MediaPlayerControl {
private SurfaceView surfaceView; //播放幕布
private MediaPlayer mediaPlayer;
private MediaController mediaController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceView);
mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.ocean);
//surfaceView的創建需要一定的時間
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
mediaController = new MediaController(MainActivity.this);
mediaController.setMediaPlayer(MainActivity.this);
mediaController.setAnchorView(findViewById(R.id.root));
mediaController.setEnabled(true);
}
@Override
public void start() {
mediaPlayer.start();
}
@Override
public void pause() {
mediaPlayer.pause();
//顯示廣告、開通會員等
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mediaController.show(); //顯示mediaController
//將觸摸事件交給mediaController去處理而不是activity
return mediaController.onTouchEvent(event);
}
}