java.lang.SecurityException:Permission Denial:读取com.android.providers.media.MediaProvider

时间:2016-10-07 04:36:33

标签: android

我想选择图片并将其保存在数据库中,当来自图库的选择图片给我例外时:

enter image description here

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);
}`

清单文件

2 个答案:

答案 0 :(得分:0)

在应用程序标记

上方的清单文件中授予权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:0)

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

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

有关详细信息,请查看此Official documentation

声明要检查的权限,

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);
    }
}