open failed EACCES (Permission denied)

Android  2021年3月29日 pm12:05发布4年前 (2021)更新 城堡大人
97 0 0

前言

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

 

 历史上的今天

  1. 2019: android导出ANR日志(0条评论)
  2. 2019: CMD分割大文件简介(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

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

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

    回复

随机推荐

Android 显示覆盖全屏的Dialog

前言有时候需要一个dialog霸占全屏,而且不让状态栏出现。PS: 我这里说的是全屏状态,然后显示dialog霸占全屏,也就是最顶层都是dialog的界面。比如我这屏幕1920 * 720,全屏(没有导航栏和状态栏)需要实现的dialog显示的区域也是1920 * 720。记录于此,方...

C语言之scanf()

前言简单记录一下scanf的使用。scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数。正文scanf说明语法:#include <stdio.h> int scanf( const char *format, ... ...

韩少功:偷书

我当年就读的中学,有一中型的图书馆。我那时不大会看书,只是常常利用午休时间去那里翻翻杂志。《世界知识》上有很多好看的彩色照片。一种航空杂志也曾让我浮想连翩。文革开始,这个图书馆照例关闭,因受到媒体批判的“毒草”越来越多,图书馆疲于清理和下架,只好一关了之。类似的情况是,城里各大书店也立刻空空荡荡,...

许立志:我咽下一枚铁做的月亮

我咽下一枚铁做的月亮他们把它叫做螺丝 我咽下这工业的废水,失业的订单那些低于机台的青春早早夭亡 我咽下奔波,咽下流离失所咽下人行天桥,咽下长满水锈的生活 我再咽不下了所有我曾经咽下的现在都从喉咙汹涌而出在祖国的领土上铺成一首耻辱的诗 ​

Android状态栏之WiFiView

前言状态栏上使用,WifiView用于显示Wifi信号强度变化。记录于此,方便自己查阅。正文隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读

张晓风:经济学的旁听生

“什么是经济学呢?”他站在讲台上,戴眼镜,灰西装,声音平静,典型的中年学者。台下坐的是大学一年级的学生,而我,是置身在这二百人大教室里偷偷旁听的一个。从一开学我就昂奋起来,因为在课表上看见要开一门《社会科学概论》的课程,包括四位教授来设“政治”“法律”“经济”“人类学”四个讲座。想起可以重新做学...