我正在尝试存储和打开从设备存储中获取的图像(相机拍摄的照片);
内部会议我可以通过
imgg.setImageURI(uri1);
打开这张图片,但是在会议结束并且新的会议开始后我得到异常:
ava.lang.SecurityException: Permission Denial: 打开供应商 com.android.providers.media.MediaDocumentsProvider 来自 ProcessRecord{3964df7 21535:com.example.myapplication/u0a121} (pid=21535, uid=10121) 要求您使用 ACTION_OPEN_DOCUMENT 或相关 API。
我搜索了互联网,尝试了很多不同的解决方案,但没有人解决我的问题。
为了清楚起见,我补充说:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/>
在 AndroidManifest.xml 中
然后我补充说:
String[] permissionsStorage = {Manifest.permission.READ_EXTERNAL_STORAGE};
int requestExternalStorage = 1;
int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissionsStorage, requestExternalStorage);
}
在我的 onCreate 函数中。
在下一次运行的应用程序询问我的权限时,我点击了“确定”,权限似乎设置为“真”,但这并没有解决我的问题。
在尝试了一些其他解决方案(这不是第一次尝试)之后,我检查了虚拟设备内部的权限,我的应用程序拥有所有权限。
但例外仍然存在。
如何处理(我读了10篇文章,都没有帮助)? 有什么共同的解决方案我是盲目的吗?
意图创造:
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
intent = new Intent();
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.putExtra(Intent.EXTRA_TEXT, "???");
intent.setType("image/*");
someActivityResultLauncher.launch(intent);
//ActivityResultContracts pew = new ActivityResultContracts.OpenDocument();
//Intent intent = new Intent();
//mGetContent.launch("image/*");
}
});
意图过程:
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@SuppressLint("WrongConstant")
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
// There are no request codes
final int takeFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Intent data = result.getData();
String FilePath = data.getData().getPath();
Uri uri = data.getData();
ContentResolver contentResolver = getActivity().getContentResolver();
contentResolver.takePersistableUriPermission(uri, takeFlags);
//contentResolver.releasePersistableUriPermission(uri,takeFlags);
Intent data2 = result.getData();
FILE_ADRESS=uri;
imgg.setImageURI(FILE_ADRESS);
FILE_PATH=FILE_ADRESS.getPath();
}
}
});
例外在这里:
final Uri uri1 = Uri.parse(str_address);
if (str_address!=null & str_address.length()>0) {
final Drawable d = Drawable.createFromPath(str_address);
imgg.setImageURI(null);
imgg.setImageURI(uri1);
}
授予所有权限(以编程方式以及在设备设置中手动授予)
最后问题出在返回 0 的标志中; 在 Intention 初始化中添加了
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
并且一切正常。该死的,这花了我一整天的时间才弄明白。
希望能帮助别人并节省宝贵的时间!谢谢大家回复! :3