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或更高。
尝试使用 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或更高。