繁体   English   中英

java.lang.SecurityException:权限拒绝:阅读com.android.providers.media.MediaProvider

[英]java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider

我想选择图像并将其保存在数据库中,当从图库中选择图像时出现异常:

在此处输入图片说明

onSelectFromGalleryResult方法中的错误:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case Utility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if(userChoosenTask.equals("Take Photo"))
                        cameraIntent();
                    else if(userChoosenTask.equals("Choose from Library"))
                        galleryIntent();
                } else {
            }
            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_FILE)
            onSelectFromGalleryResult(data);
        else if (requestCode == REQUEST_CAMERA)
            onCaptureImageResult(data);
    }
}
@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {
    Bitmap bm=null;
    if (data != null) {


        try {
    ##        bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());##
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    ivImage.setImageBitmap(bm);
}`

清单文件

在清单文件上方的应用程序标签上授予权限

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

从Android 6.0(API级别23)开始,用户在应用程序运行时(而不是在安装应用程序时)授予应用程序权限。

下面介绍了检查和请求权限的方法。 但是,使用支持库更为简单,因为在调用方法之前,您的应用程序无需检查正在运行的Android版本。

有关更多信息,请查看此官方文档

声明要检查的权限,

private static final int REQUEST_STORAGE_PERMISSIONS = 1;
private static final String[] STORAGE_PERMISSIONS = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
};

下面的功能将检查是否授予了权限,

private boolean hasPermissionsGranted(String[] permissions) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(getActivity(), permission)
                != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

使用上面的函数来定位需要授予关键权限的代码,这是执行此操作的代码-

if (!hasPermissionsGranted(STORAGE_PERMISSIONS)) {
        requestPermissions();
        return;
    }

现在,这是触发权限对话框以授予用户权限的实际代码,

private void requestPermissions() {
    if (shouldShowRequestPermissionRationale(STORAGE_PERMISSIONS)) {
        showPermissionDialog(); // Dialog to describe user how permission is important
    } else {
        requestPermissions(STORAGE_PERMISSIONS, REQUEST_STORAGE_PERMISSIONS);
    }
}

现在,处理权限请求响应,

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == REQUEST_STORAGE_PERMISSIONS) {
        if (grantResults.length == STORAGE_PERMISSIONS.length) {
            boolean isGranted = true;
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    isGranted = false; // You can tell user that critical permission denied
                    break;
                }
            }
            if (isGranted) { // perform that critical operation here... }
        } else {
            // Tell user that critical permission denied
        }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM