android 10 系统获取图片权限问题(BitmapFactory.decodeFile获取Bitmap为空)

在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” 这个属性

然后试验,发现可以成功读取文件了,问题解决。

关于android 10 (Android Q) 版本具体的系统分区权限及适配,可以参考下面文章:

Android Q分区存储权限变更及适配

你可能感兴趣的:(android小知识)