前言
最近Android 10上读取文件时,出现如下异常:
03-27 01:07:14.882 W/System.err(18732): java.io.FileNotFoundException: /storage/udisk2/wawa.mp3: open failed: EACCES (Permission denied) 03-27 01:07:14.882 W/System.err(18732): at libcore.io.IoBridge.open(IoBridge.java:496) 03-27 01:07:14.882 W/System.err(18732): at java.io.FileInputStream.<init>(FileInputStream.java:159) 03-27 01:07:14.882 W/System.err(18732): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1184) 03-27 01:07:14.883 W/System.err(18732): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1162) 03-27 01:07:14.883 W/System.err(18732): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1127) 03-27 01:07:14.883 W/System.err(18732): at com.la.mediabutton.TMediaService.onStartCommand(TMediaService.java:71) 03-27 01:07:14.883 W/System.err(18732): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4165) 03-27 01:07:14.883 W/System.err(18732): at android.app.ActivityThread.access$1800(ActivityThread.java:234) 03-27 01:07:14.883 W/System.err(18732): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1914) 03-27 01:07:14.883 W/System.err(18732): at android.os.Handler.dispatchMessage(Handler.java:107) 03-27 01:07:14.884 W/System.err(18732): at android.os.Looper.loop(Looper.java:214) 03-27 01:07:14.884 W/System.err(18732): at android.app.ActivityThread.main(ActivityThread.java:7626) 03-27 01:07:14.884 W/System.err(18732): at java.lang.reflect.Method.invoke(Native Method) 03-27 01:07:14.884 W/System.err(18732): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503) 03-27 01:07:14.884 W/System.err(18732): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 03-27 01:07:14.885 W/System.err(18732): Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 03-27 01:07:14.885 W/System.err(18732): at libcore.io.Linux.open(Native Method) 03-27 01:07:14.885 W/System.err(18732): at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 03-27 01:07:14.885 W/System.err(18732): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252) 03-27 01:07:14.886 W/System.err(18732): at libcore.io.ForwardingOs.open(ForwardingOs.java:167) 03-27 01:07:14.886 W/System.err(18732): at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7500) 03-27 01:07:14.886 W/System.err(18732): at libcore.io.IoBridge.open(IoBridge.java:482)
总结
解决上面问题,需要执行如下步骤:
- AndroidManifest.xml中配置权限
- 需要动态申请权限
但,还是存在上面问题,最后查询后发现Android 10需要在application标签内加上
android:requestLegacyExternalStorage="true"
原因
自Android10.0起,为了能够更好的使用分区存储,为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备强制启用了该行为。
正文
我们知道Android 6开始,除了在AndroidManifest.xml中配置权限,还想需要动态申请权限。
配置需要的权限
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Activity中动态申请权限
public class PermissionUtils { private static final String TAG = PermissionUtils.class.getSimpleName(); //申请需要的所有权限 public static final String REQUEST_MANIFEST_PERMISSION[] = new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, }; public static void requestPerssion(Activity activity, int requestCode) { if (null == activity) { Log.d(TAG, "requestPerssion null : "); return; } // Android 6.0后非系统应用需要申请权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(activity, REQUEST_MANIFEST_PERMISSION, requestCode); } return; } }
application
自Android 10后,需要在AndroidManifest.xml中的application标签中配置如下属性。
android:requestLegacyExternalStorage="true"
参考文章
© 版权声明
哈哈 你确定看完了上面的提示么。
【本文为私人笔记】有些文章被我们站长限制了访问权限。
部分用户查阅。