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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值