Android高版本权限问题

java.io.FileNotFoundException: /storage/emulated/0/video.mp4: open failed: EACCES (Permission denied)

《第一行代码》书中“8.4.2 播放视频”的代码在书中的 Nougat 版本运行没有问题,但是在 Pie 中会显示如下图所示Can't play this video.

can't_play_this_video

Log 中会显示如下:

2019-11-13 16:46:36.273 6238-6238/xxx.xxx.mainActivity/VideoView: Unable to open content: /storage/emulated/0/video.mp4
java.io.FileNotFoundException: /storage/emulated/0/video.mp4: open failed: EACCES (Permission denied)

查询了一圈发现原因是:书中代码直接操作的是根目录下的 video.mp4 文件,但是在 API level 29 之后,软件默认只有操作其自身目录下的内容的权限,当需要对其他内容进行操作时需要获取权限,特别是当 targetSdkVersion >= 29 时,需要将requestLegacyExternalStorage 更改为 true (default: false)

解决方法

AndroidManifest.xml 文件中的 <application> 中添加android:requestLegacyExternalStorage="true"