授予 READ_EXTERNAL_STORAGE 权限,但仍然出现异常 java.lang.SecurityException: Permission Denial

问题描述 投票:0回答:1

我正在尝试存储和打开从设备存储中获取的图像(相机拍摄的照片);

内部会议我可以通过

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


        }

授予所有权限(以编程方式以及在设备设置中手动授予)

java android android-manifest android-permissions
1个回答
0
投票

最后问题出在返回 0 的标志中; 在 Intention 初始化中添加了

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
并且一切正常。该死的,这花了我一整天的时间才弄明白。

希望能帮助别人并节省宝贵的时间!谢谢大家回复! :3

© www.soinside.com 2019 - 2024. All rights reserved.