Mediaplayer无法打开已解析的URI

时间:2015-10-30 10:56:09

标签: java android android-permissions

尝试使用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:没有内容提供者:/ storage1A0C-331C /victamjpeg.sdp

     

10-30 01:11:38.640 4293-4293 /? W / VideoView:java.io.FileNotFoundException:/ storage1A0C-331C /victamjpeg.sdp:open failed:EACCES(Permission denied)

     

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拥有。

2 个答案:

答案 0 :(得分:3)

首先,您的<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

答案 1 :(得分:2)

uses-permission标签需要在应用程序标签之外。