Mediaplayer 无法打开已解析的 URI

Mediaplayer fails to open parsed URI

尝试使用 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: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: /storage/1A0C-331C/victamjpeg.sdp

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

10-30 01:11:38.640 4293-4293/? W/VideoView: at java.io.FileInputStream.(FileInputStream.java:76) 10-30 01:11:38.640 4293-4293/? W/VideoView: at java.io.FileInputStream.(FileInputStream.java:76) 

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

uses-permission 标签需要在 application 标签之外。

首先,您的 <uses-permission> 元素似乎放错了位置。他们需要是 <manifest> 的 children,<application> 的同龄人。你所拥有的显示为 children of <application>.

二、替换:

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

与:

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

这处理了 getExternalStorageDirectory() returns 具有尾随 / 的值的情况。它还将方案放在 Uri 中,而您的实现没有这样做,从而导致普遍无效的 Uri.

另请注意,如果您在 Android 6.0 上进行测试,则存储权限为 dangerous,如果您的 targetSdkVersion 为 23,则需要使用 the runtime permission system或更高。