【问题标题】:"Required permission was denied!" when requesting WRITE_EXTERNAL_STORAGE“所需的权限被拒绝!”请求 WRITE_EXTERNAL_STORAGE 时
【发布时间】:2020-07-23 05:49:45
【问题描述】:

我正在尝试在 Android 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
  • 我要问你是否将它添加到清单文件中?
  • 是的,在manifest中要求。

标签: android android-permissions


【解决方案1】:

我已经找到了解决方案,但是问题的原因对我来说仍然是个谜。如果有人有解释,将不胜感激。基本上我的问题是这个issue 的副本。我所要做的就是将以下行从

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

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

tools:node="replace" 有什么作用?

【讨论】:

  • 谢谢。这行得通。对于接下来要面对这个问题的人。您还需要将 android:requestLegacyExternalStorage="true" 添加到您的 AndroidManifest 文件中
【解决方案2】:

您可以使用此方法处理请求的权限(适用于 android 10)Here is the documentation.

    @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;
            }
        }
    }

【讨论】:

    【解决方案3】:

    您可以使用 nabinbhandari 的 Android 运行时权限库 在你的 build.gradle app module 文件中写下这个

     //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();
    
                }
            });
    

    【讨论】:

    • 我使用了这个代码。它告诉我尚未设置所需的权限,然后将我引导至不允许我设置存储权限的设置。我可以在那里设置的唯一权限是位置权限。感觉就像我在清单上做错了什么。如果我想手动设置权限,我在存储权限列表中找不到我的应用程序。
    • 你能告诉我你的清单文件吗?使用粘贴 bin 网站并在此处分享链接。
    猜你喜欢
    • 2018-09-17
    • 2019-09-20
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2021-01-07
    • 2020-12-18
    相关资源
    最近更新 更多