“所需的权限被拒绝!”请求WRITE_EXTERNAL_STORAGE时

时间:2020-04-10 13:09:26

标签: android android-permissions

我正在尝试在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以外的所有其他权限均有效。当我尝试请求它时,它不显示任何用于确认许可的对话框,而只是拒绝它。为什么以及如何解决?

3 个答案:

答案 0 :(得分: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”有什么作用?

答案 1 :(得分:0)

您可以使用nabinbhandari使用Android运行时权限库 在您的 build.gradle应用模块文件中将此内容写

.log

在清单文件中写

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

并在Activity中声明这些变量

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

然后在您的onCreate()方法中编写

    String[] permissions = new String[]{READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE};
    String rationale = "Please provide storage permission to proceed ...";

答案 2 :(得分:0)

您可以使用此方法(适用于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;
            }
        }
    }