ContextCompat.checkSelfPermission возвращает -1, несмотря на предоставление WRITE_EXTERNAL_STORAGE

В настройках телефона разрешения даны. Телефон с Андроид 8.0.

compileSdkVersion 28
minSdkVersion 16
targetSdkVersion 28

В манифесте есть:

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

В моем коде эта переменная «разрешения» всегда равна -1:

int permissions = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
136
2

Ответы 2

Начиная с Android 6 (API 23) вы также должны запрашивать это разрешение во время выполнения. Это видео может помочь: https://thewikihow.com/video_WGz-alwVh8A

Хорошо, спасибо Ларри Шиферу за разрешения во время выполнения.

Учитывая документы Android:

ссылка 1ссылка 2

Я внес некоторые изменения в метод из ссылки 2. Перед тем, как что-то сделать, он проверяет разрешения и при необходимости запрашивает подтверждение у пользователя, в противном случае устанавливает разрешения принудительно.

    public void requestRuntimePermission(final Context context, final String manifestPermission, final int requestCode) {

        int permissions = ContextCompat.checkSelfPermission(context, manifestPermission);
        if (permissions != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                    manifestPermission)) {

                android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
                builder.setMessage("Allow access?")
                        .setCancelable(true)
                        //Cancel
                        .setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        })
                        //Ok
                        .setPositiveButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                ActivityCompat.requestPermissions((Activity) context,
                                        new String[]{manifestPermission},
                                        requestCode);
                            }
                        });
                android.support.v7.app.AlertDialog alert = builder.create();
                alert.show();

            } else {
                // Permission has not been granted yet. Request it directly.
                ActivityCompat.requestPermissions((Activity) context, new String[]{manifestPermission},
                        requestCode);
            }

        }
    }

Пример использования:

requestRuntimePermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE, 0);

P.S. Параметр requestCode в requestRuntimePermission можно использовать для определения того, какое разрешение разрешено в обратном вызове onRequestPermissionsResult. (ссылка 3)

Другие вопросы по теме