在android 6.0以后,权限不止是在AndroidManifest.xml文件里面声明,而且需要在代码中动态获取,这一点大部分人应该都很清楚了,如果不清楚,可以看下面代码(这里以读写文件和相机权限为例):
// 准备申请的权限
private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA};
private static final int REQUEST_CODE = 10001;
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
for (String permission : permissions) {
// GRANTED---授权 DINIED---拒绝
if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) == PackageManager.DINIED) {
ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
}
}
}
用以上代码去申请权限。
在最近的开发过程中,发现在华为P30等手机上,调用系统获取图片或者是拍照获取图片时候获取不到,通过以下方法获得图片的Bitmap时为空:
Bitmap bitmap1 = BitmapFactory.decodeFile(outputFile.getAbsolutePath());
然后通过另外方式获取Bitmap
byte[] bytes = new byte[(int) outputFile.length() + 1];
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(outputFile.getAbsoluteFile());
inputStream.read(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
LogUtils.e("test", " FileNotFoundException e " + e.toString());
} catch (IOException e) {
LogUtils.e("test", " IOException e " + e.toString());
}
bitmap1 = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
结果Catch 到 FileNotFoundException e java.io.FileNotFoundException: /storage/emulated/0/Pictures/xxxxx.jpg: open failed: EACCES (Permission denied)
没有权限,但上面明明已经申请权限,且已经手动赋予权限。在手机设置里面的App权限管理里面找到对应App,发现确实是有存储权限的,实在是不放心,又在代码里打印出来,确认App有读写存储权限:
boolean permission_readStorage = (PackageManager.PERMISSION_GRANTED ==
activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE));
boolean permission_writeStorage = (PackageManager.PERMISSION_GRANTED ==
activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE));
打印出来,都有权限,更百思不得其解,继续找相关资料,发现在android 10系统中
需要在文件下AndroidManifest.xml 加上android:requestLegacyExternalStorage = “true” 这个属性
<application android:requestLegacyExternalStorage = “true”>
然后试验,发现可以成功读取文件了,问题解决。
关于android 10 (Android Q) 版本具体的系统分区权限及适配,可以参考下面文章: