"Требуется разрешение было отказано!" при запросе WRITE_EXTERNAL_STORAGE - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь запросить разрешение WRITE_EXTERNAL_STORAGE на Android 10. Я делаю это, используя следующий код:

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 голосов
/ 10 апреля 2020

Вы можете обработать запрошенное разрешение, используя этот метод (работает с 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;
            }
        }
    }
0 голосов
/ 14 апреля 2020

Я нашел решение, однако причина проблемы до сих пор для меня загадка. Если у кого-нибудь есть объяснение, оно будет с благодарностью. По сути, моя проблема - дубликат этой проблемы . Все, что мне нужно было сделать, это изменить следующую строку с

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

на

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

Что делает tools: node = "replace"?

0 голосов
/ 10 апреля 2020

Вы можете использовать Android Runtime Permission Library от nabinbhandari в вас build.gradle модуль приложения файл напишите это

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

            }
        });
...