开发环境:android studio 2022.2.1
android版本: android 13
API: MediaPlayer SurfaceView MediaController
1.布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="600dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="file" android:onClick="click" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/surface_view" /> </androidx.constraintlayout.widget.ConstraintLayout>
2.Activity代码
package com.example.videoplayer;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.View;
import android.widget.MediaController;
import com.example.videoplayer.databinding.ActivityMainBinding;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements
MediaController.MediaPlayerControl,
MediaPlayer.OnBufferingUpdateListener,
SurfaceHolder.Callback {
private final int REQUEST_PERMISSIONS_RETURN_CODE = 10;
private String[] mPermissions = {
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
};
private ActivityMainBinding mBinding;
private MediaPlayer mMediaPlayer;
private MediaController mMediaController;
private int mPercentage = 0;
private ActivityResultLauncher<Object> mActivityResultLauncher;
private Uri mUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaController = new MediaController(this);
mMediaController.setAnchorView(mBinding.rootLayout);
mMediaController.setMediaPlayer(this);
mBinding.surfaceView.setZOrderOnTop(false);
mBinding.surfaceView.getHolder().addCallback(this);
mActivityResultLauncher = registerForActivityResult(mActivityResultContract, mActivityResultCallback);
requestPermissions();
}
//触摸屏幕后显示MediaController
@Override
public boolean onTouchEvent(MotionEvent event) {
mMediaController.show();
return super.onTouchEvent(event);
}
@Override
protected void onPause() {
super.onPause();
mMediaPlayer.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.release();
}
}
@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
mPercentage = i;
}
@Override
public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
mMediaPlayer.setDisplay(surfaceHolder);
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
}
@Override
public void start() {
mMediaPlayer.start();
}
@Override
public void pause() {
mMediaPlayer.pause();
}
@Override
public int getDuration() {
return mMediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mMediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int i) {
mMediaPlayer.seekTo(i);
}
@Override
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return mPercentage;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
private final ActivityResultContract<Object, Uri> mActivityResultContract = new ActivityResultContract<Object, Uri>() {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Object o) {
return new Intent(Intent.ACTION_GET_CONTENT).setType("video/*").addCategory(Intent.CATEGORY_OPENABLE);
}
@Override
public Uri parseResult(int i, @Nullable Intent intent) {
return intent != null ? intent.getData() : null;
}
};
Handler mHandler = new Handler();
private void prepare() {
try {
mMediaPlayer.setDataSource(this, mUri);
mMediaPlayer.prepare();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private final ActivityResultCallback<Uri> mActivityResultCallback = result -> {
mUri = result;
mHandler.post(this::prepare);
mMediaController.show(10 * 1000);
};
private void requestPermissions() {
try {
ActivityCompat.requestPermissions(this, mPermissions, REQUEST_PERMISSIONS_RETURN_CODE);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSIONS_RETURN_CODE) {
if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Log.e("onRequestPermissionsResult", "Permissions Denied!");
}
}
}
//点击按钮进行选择视频文件
public void click(View view) {
mActivityResultLauncher.launch(null);
}
}
3.效果演示