请求 WRITE_EXTERNAL_STORAGE 权限时出现 "Required permission was denied!" 错误。

4

我正在尝试在安卓10上请求WRITE_EXTERNAL_STORAGE权限。我使用以下代码来完成:

ArrayList<String> permissions = new ArrayList<>();
if (this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (this.checkSelfPermission(ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
        this.checkSelfPermission(ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    permissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (permissions.size() > 0) requestPermissions(permissions.toArray(new String[0]), PERMISSION_REQUEST_FINE_LOCATION);

这里是清单

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

除了WRITE_EXTERNAL_STORAGE权限之外,其他所有权限都有效。当我尝试请求此权限时,它不会显示任何用于确认权限的对话框,而是直接拒绝。为什么?我该如何解决?


确保你的清单文件中有WRITE_EXTERNAL_STORAGE - CommonsWare
我必须问一下,你是否将它添加到清单文件中了? - Abdelaziz refaat
是的,在清单文件中请求了。 - Miha Bogataj
3个回答

6
我已经找到了解决方案,但问题的原因对我来说仍然是个谜。如果有人能够提供解释,那将不胜感激。基本上我的问题是与此问题重复了。我所做的只是将以下这行代码进行更改。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

to

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>

tools:node="replace" 是什么意思?


谢谢。这个方法可行。对于下一个遇到这个问题的人,你还需要在AndroidManifest文件中添加android:requestLegacyExternalStorage="true" - dilantha111
为什么我们需要添加 tools:node="replace"android:requestLegacyExternalStorage="true"?它们有什么作用? - c-an

0

您可以使用nabinbhandari的Android运行时权限库,在您的build.gradle app模块文件中编写以下内容:

 //Android Runtime Permission Library
        implementation 'com.nabinbhandari.android:permissions:3.8'

在你的清单文件中写入:

。。。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在Activity中声明这些变量。
    String[] permissions = new String[]{READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE};
    String rationale = "Please provide storage permission to proceed ...";

在你的onCreate()方法中写入以下内容。
Permissions.Options options = new Permissions.Options()
                .setRationaleDialogTitle("Info")
                .setSettingsDialogTitle("Warning");

        Permissions.check(MainActivity.this, permissions, rationale, options, new PermissionHandler() {
            @Override
            public void onGranted() {
                // do your task.
                Toast.makeText(MainActivity.this, "Permissions granted", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onDenied(Context context, ArrayList<String> deniedPermissions) {
                // permission denied
                Toast.makeText(MainActivity.this, "Permissions denied", Toast.LENGTH_SHORT).show();

            }
        });

我使用了这段代码。它告诉我必需的权限还没有设置,然后引导我进入设置页面,但是它不允许我设置存储权限。在那里我只能设置位置权限。感觉好像是我的清单文件出了问题。如果我想手动设置权限,我找不到我的应用程序在存储权限列表中。 - Miha Bogataj
你能给我展示一下你的清单文件吗?使用Paste Bin网站并在此处共享链接。 - zeeshan7799

0

您可以使用此方法(适用于Android 10)处理所请求的权限,这里是文档。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            switch (requestCode) {
                case PERMISSION_REQUEST_ID_STORAGE:
                    // permisstion granted by user
                    break;
            }
        } else {
            switch (requestCode) {
                case PERMISSION_REQUEST_ID_STORAGE:
                    // permission denied by user
                    break;
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接