![](/img/trans.png)
[英]java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider in Android while taking picture from gallery
[英]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.