尝试使用Uri.parse打开文件,但一直拒绝访问它。我对什么是错很困惑。

为便于阅读而裁剪的Manifest.xml

<application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</application>


导致错误的代码段:

Uri video = Uri.parse(Environment.getExternalStorageDirectory()
               .getAbsolutePath()+"/victamjpeg.sdp");

videoView.setVideoURI(video);


和实际的错误:


  10-30 01:11:38.640 4293-4293 /? W / MediaPlayer:无法在客户端打开文件;尝试服务器端:java.io.FileNotFoundException:无内容提供者:/storage/1A0C-331C/victamjpeg.sdp
  
  10-30 01:11:38.640 4293-4293 /? W / VideoView:java.io.FileNotFoundException:/storage/1A0C-331C/victamjpeg.sdp:打开失败:EACCES(权限被拒绝)
  
  10-30 01:11:38.640 4293-4293 /? W / VideoView:在java.io.FileInputStream。处(FileInputStream.java:76)
  10-30 01:11:38.640 4293-4293 /? W / VideoView:在java.io.FileInputStream。处(FileInputStream.java:76)


看来我没有阅读权限,但据我所知必须设置该权限。从ls -l执行adb shell证明文件位于/sdcard/victamjpeg.sdp并由root拥有。

最佳答案

首先,看来您的<uses-permission>元素放置在错误的位置。他们必须是<manifest>的孩子,<application>的同伴。您所显示的内容将它们显示为<application>的子代。

二,更换:

Uri video = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/victamjpeg.sdp");


与:

Uri video = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "victamjpeg.sdp"));


这可以处理getExternalStorageDirectory()返回尾随/的值的情况。还将方案放在Uri中,而您的实现未将其放入,导致普遍无效的Uri

还要注意,如果您在Android 6.0上测试存储权限为dangerous,并且targetSdkVersion为23或更高版本,则需要使用the runtime permission system

关于java - Mediaplayer无法打开已解析的URI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33434315/

10-09 01:46