android6.0系统读取sd卡权限奇葩问题

永正 2016-03-23 02:12:35

android6.0读取sd卡文件问题

在小米系统6.0,可以正常读取(小米5.0,华为5.0,和其他手机我测试过几台,都可以正常读取,显示图片)
唯独华为荣耀7的6.0,读取图片失败,说没有权限。

爆出异常:Unable to decode stream: java.io.FileNotFoundException: /storage/143B-DA69/DCIM/Camera/IMG_20160321_125830.jpg: open failed: EACCES (Permission denied)


代码简单,直接读取sd卡上面的图片,显示在imageView上面
(为了方便,我直接写死一个图片路径,图片是存在的)
Bitmap bitmap = compressImage("/storage/143B-DA69/DCIM/Camera/IMG_20160321_125830.jpg");
if (bitmap==null){
VLog.showToast(this,"is null");
}else {
img.setImageBitmap(bitmap);
}



//文件转bitmap
public static Bitmap compressImage(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回 bm 为空
options.inJustDecodeBounds = false; // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = (int) (options.outHeight / (float) 640);
if (be <= 0)
be = 1;
options.inSampleSize = be; // 重新读入图片,注意此时已经把 options.inJustDecodeBounds
// 设回 false 了
bitmap = BitmapFactory.decodeFile(path, options);
return bitmap;
}

添加权限(我项目的权限,有些网络请求的权限我就不删除,直接拷贝过来)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />



找了好久原因,一开始以为我代码有问题,发现,在其他手机可以,唯独我荣耀7的6.0,运行出错。

然后我在各大应用市场,下载一下小应用(做到粗糙的app,感觉没有做什么适配的那些app)试了一试,发现,他们读取sd卡的可以,也可以读取图片。

太奇怪了。

找了一个晚上,早上我改了一下 targetSdkVersion 23 改为 targetSdkVersion 22
然后运行,发现可以了,没有爆出没有权限的错误,基本所有手机都可以。


下面是荣耀7的6.0系统出现权限问题的配置(targetSdkVersion 改为22可以成功运行)

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "interest.pictest23"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}


到底是什么原因?是华为6.0的bug还是我编译的问题?


...全文
30961 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
王能 2019-11-08
  • 打赏
  • 举报
回复
引用 14 楼 chf920812 的回复:
真是奇葩。 我编译版本29在小米手机上也这样 改成 28可以了。
禁止挖坟
chf920812 2019-11-06
  • 打赏
  • 举报
回复
真是奇葩。 我编译版本29在小米手机上也这样 改成 28可以了。
菜鸟的华丽 2016-11-30
  • 打赏
  • 举报
回复
楼主知道什么原因了吗。我改成22 也没事了,但是原理是啥啊
南隅有 2016-11-30
  • 打赏
  • 举报
回复
android 6.0 API 23 权限管理需要申请 targetSdk=22 时,按以往权限管理处理
余烬岛游戏 2016-11-14
  • 打赏
  • 举报
回复
百度 Android 6.0 运行时权限
blanks.w 2016-11-14
  • 打赏
  • 举报
回复
6.0要动态申请权限
sunkess 2016-11-11
  • 打赏
  • 举报
回复
引用 1 楼 u010064206 的回复:
虽然解决了。。
非常感谢,若不是看了你写的,我现在还没有找到原因。
ink_s 2016-10-13
  • 打赏
  • 举报
回复
Android 6.0 的特性
Wowda 2016-10-13
  • 打赏
  • 举报
回复
楼主,我也报了跟你一样的错误, targetSdk=23,4.0的小米、联想没什么错误,6.0华为报了跟你一样的错,我是在 BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(mUri))所在方法加了READ_EXTERNAL_STORAGE权限就可以了
u010102020 2016-08-23
  • 打赏
  • 举报
回复
Bitmap bitmap = compressImage("/storage/143B-DA69/DCIM/Camera/IMG_20160321_125830.jpg");
里的sd卡的名字这个在哪里配置的啊
萌新小柴鸡 2016-07-01
  • 打赏
  • 举报
回复
targetSdkVersion 改成22就行了!
ifu25 2016-05-26
  • 打赏
  • 举报
回复
我在6.0的模拟器上写SD卡一直失败,找了半天才发现原来应用的存储卡写权限要手动授权。
jklwan 2016-04-19
  • 打赏
  • 举报
回复
targetSdk为23时在6.0手机上需要手动申请权限。至于小米的不知道是不是改了系统自动给了权限。你可以试试把那些应用的权限给关闭了,分分钟报错。
chentong2419 2016-04-18
  • 打赏
  • 举报
回复
运行时需要再申请权限,6.0的特性。
永正 2016-03-23
  • 打赏
  • 举报
回复
虽然解决了。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧