android - 不能使用 MediaStore.Images.Media.insertImage
问题描述
我有一个项目在商店启动并运行,突然客户开始抱怨无法使用我的应用程序捕获图像,尽管我没有在这部分进行任何更改,我只是更新了 android 并为不相关的问题创建了一个新版本捕捉图像
这是我的代码
@Override
public void saveImage(PictureTransaction xact, Bitmap bitmap) {
String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, getPhotoFilename(), null);
if(path == null) {
final Activity activity = getActivity();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, getString(R.string.photo_save_error_toast), Toast.LENGTH_SHORT).show();
mTakePictureBtn.setEnabled(true);
mProgressDialog.dismiss();
}
});
} else {
Uri contentUri = Uri.parse(path);
final Image image = getImageFromContentUri(contentUri);
// run the media scanner service
// MediaScannerConnection.scanFile(getActivity(), new String[]{path}, new String[]{"image/jpeg"}, null);
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri));
// the current method is an async. call.
// so make changes to the UI on the main thread.
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
((ImagePickerActivity) getActivity()).addImage(image);
mTakePictureBtn.setEnabled(true);
mProgressDialog.dismiss();
}
});
}
}
后台发生的错误如下
Failed to insert image
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5494, uid=10570 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1693)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1280)
at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:1025)
at nl.changer.polypicker.CwacCameraFragment$DemoCameraHost.saveImage(CwacCameraFragment.java:172)
at nl.changer.polypicker.camera.ImageCleanupTask.run(ImageCleanupTask.java:136)
当然,我已经在我的应用程序的清单以及运行时权限和用户接受对话框中请求了READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE、CAMERA ,但仍然给出该错误
有人可以帮忙吗?
编辑
if (PermissionManager.getInstance().hasSelfPermissions(getActivity(), PermissionManager.getInstance().getCameraAndStoragePermissions()) == false) {
mImageAndVideoParentLayout.setVisibility(View.GONE);
PermissionManager.getInstance().checkForCameraAndStoragePermissions2((Fragment) this, PermissionManager.CAMERA_STORAGE_PERMISSIONS);
} else {
mImageAndVideoParentLayout.setVisibility(View.VISIBLE);
}
------------------------
public boolean hasSelfPermissions(Context context, String... permissions) {
for (String permission : permissions) {
if (!hasSelfPermission(context, permission)) {
return false;
}
}
return true;
}
-----------------------
public String[] getCameraAndStoragePermissions() {
return mCameraAndStoragePermissions;
}
-------------------------------
private String [] mCameraAndStoragePermissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
---------------------------
public void checkForCameraAndStoragePermissions2(Fragment fragment, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fragment.requestPermissions(mCameraAndStoragePermissions, requestCode);
} else {
Log.i("AMIRA", "Below M, permissions not via code");
}
}
--------------------------
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.i("AMIRA", "PostAdFragment : onRequestPermissionsResult " + requestCode);
if (requestCode == PermissionManager.LOCATION_PERMISSIONS) {
initalizeMap();
} else if (requestCode == PermissionManager.CAMERA_STORAGE_PERMISSIONS) {
mImageAndVideoParentLayout.setVisibility(View.VISIBLE);
}
}
解决方案
您是否处理过用户拒绝权限或单击不再显示时发生的情况?您应该在权限被禁用时禁用这些功能,或者一次又一次地提示直到获得权限。
编辑:
Android 现在使用 maxSdkVersion 过滤器限制 WRITE_EXTERNAL_STORAGE 权限。在某些用例中,例如应用程序包含需要此权限的依赖项,maxSdkVersion 使这些依赖项无法授予或请求权限。这些情况的解决方案是稍后在依赖树中声明 tools:node="replace" 清单合并策略:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
推荐阅读
- amazon-web-services - AWS Glacier 分段上传:最后一部分大小 --range 选项
- reactjs - 如何将后端和前端放在一起 - 从 fastapi 后端端点返回反应前端
- python - while 语句忽略函数
- inno-setup-v6 - InnoSetup v6 ARC 提取,最小化损坏
- javascript - 将元素添加到 for 循环中的其他元素仅呈现最后一项
- c# - 使用 Azure AD 的用户管理器
- java - 无法将 SQL 查询映射到数据节点上的拓扑
- jquery - 在jQuery中创建的元素中分组在单个变量中的数组的值
- python - 如何忽略文件中文本的特定部分并在 python 中打印其余部分?
- python - 在 Django 模板中检索用户上传的图像