前言

最近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)

总结

解决上面问题,需要执行如下步骤:

  1. AndroidManifest.xml中配置权限
  2. 需要动态申请权限

但,还是存在上面问题,最后查询后发现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"

参考文章

  1. 关于安卓open failed: EACCES (Permission denied)

 

相关文章

暂无评论

  • 改变自己
    改变自己 管理员

    哈哈 你确定看完了上面的提示么。
    【本文为私人笔记】有些文章被我们站长限制了访问权限。
    部分用户查阅。

    广东深圳市
    回复