关于android11,12权限问题Unable to decode stream: open failed: EACCES (Permission denied)

第一次发博客

这个问题是我在制作一款app时发现的,我本来想在一个textview中加入一个图片

String picturePath = "your.jpg";
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
Drawable d = new BitmapDrawable(getResources(), bitmap);
textview.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);

但是总是报错

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20230129_123518.jpg: open failed: EACCES (Permission denied)

我在浏览了大多数关于这个问题的讨论和官方文档之后,他们无非就是给了这几种办法:

1.在Manfest.xml中添加这个

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

结论:按你的需求添加读写权限,但manage是必须的

2.“在你的xml文件中添加一句话,所有问题都解决了”

android:requestLegacyExternalStorage="true"

这句话本身是片面的,如果这个应用所在系统是在android10及以下,那么你加上这句话的确能解决问题,在android10以后,系统加了新的分区机制,具体可以看看官方的文档

这句代码的意思就是说将这个新的分区机制换成旧的,那么这个权限问题就不存在了,这显然是治标不治本

3.还有各种在java文件中申请权限的

String[] permission = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
ActivityCompat.requestPermissions(Mainactivity.this, permission, 1);

这种呢是属于申请了一部分权限

4.我是小米手机,有的打开了系统的“所有访问权限”页面,但是那里面没有我的应用,我也不知道为什么

5.解决方案

if (Environment.isExternalStorageManager()) {
    tv.setText("666");
    String picturePath = "/storage/emulated/0/DCIM/Camera/IMG_20230129_123518.jpg";
    Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
    Drawable d = new BitmapDrawable(getResources(), bitmap);
    textview.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);
}else {
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + this.getPackageName()));
    startActivity(intent);
        }

这样直接跳转到应用的所有访问权限页面,同意就大功告成了

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值