android6.0读取sd卡文件问题
if (Build.VERSION.SDK_INT >= 23) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } }
在小米系统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'
}
}
}