Android Studio实现本地视频播放

关于MediaPlayer错误[open failed: EACCES (Permission denied)]

报错信息

可能会有下面几个方面的错

1.权限没有添加

1)在AndroidMainifest.xml文件中添加用户权限


2)还要动态获取权限
在MainActivity中添加
private final int REQUEST_EXTERNAL_STORAGE = 1;
private String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE };

         public  void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE);
    }
}

记得在onCreat()方法中调用
verifyStoragePermissions(this);
当然可以简单粗暴的通过配置用户信息添加存储权限

2. targetSdkVersion过高


将targetSdkVersion改为26 本来我这里是29的 太高了 导致编译的时候出错 改为26就可以了

对于此次本地视频播放器的实现 最为纠结的就是页面显示 播放器出错 看了许多篇博客 都是权限的问题 我在最初的时候就添加了权限所以很可能不是这个问题 又尝试用其他方法实现播放 发现还是MediaPlayer好写一些可以用监听实现
还有一些博客说content provider这个没有试过 我试了调试的方法 发现能定位到uri的位置 还有最重要的一点 遇到问题 要自己分析 试着调试一下 找到问题的所在
在这里插入图片描述
本来以为实现不了了 又翻到一篇很有用的博客 改了targetSdkVersion就实现了本地视频的播放

下面附上一些代码

public class SystemVedioPlayer extends AppCompatActivity {

private VideoView videoView;
private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_system_vedio_player);
    videoView=findViewById(R.id.videoview);

    uri=getIntent().getData();
    System.out.println("uri:"+uri);
    videoView.setVideoURI(uri);


   videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
       @Override
       public void onPrepared(MediaPlayer mp) {
           videoView.start();
       }
   });


    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Toast.makeText(SystemVedioPlayer.this,"播放出错了",Toast.LENGTH_SHORT).show();
            System.out.println("what:"+what+"\n extra: "+extra);
            return true;
        }
    });
    videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            Toast.makeText(SystemVedioPlayer.this,"播放已完成 ",Toast.LENGTH_SHORT).show();
            finish();
        }
    });
    //设置控制面板
     videoView.setMediaController(new MediaController(this));
}

}

//设置视频点击事件
vedioPager.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MediaItem mediaItem=mediaItems.get(position);
//使用系统自带播放软件
// Intent intent=new Intent();
// intent.setDataAndType(Uri.parse(mediaItem.getData()),“video/");
// mContext.startActivity(intent);
Intent intent=new Intent(mContext, SystemVedioPlayer.class);
intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/
”);
System.out.println("Uri.parse(mediaItem.getData(): "+Uri.parse(mediaItem.getData()));
mContext.startActivity(intent);

参考网址:
[1]: https://cloud.tencent.com/developer/article/1381003
[2]: https://blog.csdn.net/twc18638942853/article/details/53218659

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页