Как снова спрашивают разрешения?

Я пытаюсь скопировать мою базу данных SQLite во «внешнее» хранилище в качестве средства резервного копирования файла базы данных. Оттуда пользователь может взять файл .db и перейти в безопасное место.

Следуя документации разработчика Android по получению разрешения на WRITE_EXTERNAL_STORAGE, я ввел дословно показанный код и прошел через него с помощью отладчика. (Я изменил READ_CONTACTS на WRITE_EXTERNAL_STORAGE)

Сначала он выполнит checkSelfPermission и пропустит shouldShowRequestPermissionRationale при переходе к requestPermissions . Затем мне выдается всплывающее окно с запросом моего разрешения.

Если я это отрицаю, то при втором прогоне он снова перейдет к checkSelfPermission, а затем перейдет к shouldShowRequestPermissionRationale , но пропустите requestPermissions и прекратите запрашивать разрешение снова, как указано в документации Android.

Мои вопросы:

  1. Должен ли я добавить вызов requestPermissions в блоке shouldShowRequestPermissionRationale if (), чтобы он снова спрашивал ? Или есть другой способ?
  2. Если я хочу объяснить причину или рациональную причину, по которой требуется разрешение, должен ли я реализовать собственное окно AlertDialog? Или есть метод установки для повторного запроса AlertBox, который я еще не обнаружил, чтобы предоставить системе мое объяснение?

До сих пор все, что я делал при написании этого приложения, было опытом обучения. Я хорошо провожу время.

РЕДАКТИРОВАТЬ: у меня есть

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

установлен в моем Манафесте.


person Programming Padawan    schedule 06.03.2018    source источник


Ответы (3)


Как снова спрашивают разрешение?

Краткий ответ: спросите его еще раз.

Некоторое объяснение: вы можете предоставить диалоговое окно с предупреждением или что-то еще, чтобы продемонстрировать, почему вам нужно это разрешение, также это не требуется делать каждый раз, потому что пользователь может знать, какое разрешение требуется, в зависимости от действия, однако там это метод, который я использовал для проверки разрешений, и он выглядит так:

public class CheckPermissions {


public static boolean hasPermission(int PERMISSION_REQUEST, String permission, Context context) {
    if (ContextCompat.checkSelfPermission(context,
            permission)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                permission)&&
                ContextCompat.checkSelfPermission(context,
                        permission)
                        != PackageManager.PERMISSION_GRANTED){

            return false;

        } else {

            ActivityCompat.requestPermissions((Activity) context,
                    new String[]{permission},
                    PERMISSION_REQUEST);

        }

        return false;
    } else {
        return true;


       }
    }
}

Так что вы можете проверять каждый раз, когда вам нужно.

 if (CheckPermissions.hasPermission(PERMISSION_REQUEST, Manifest.permission.YOUR_PERMISSION, context)){
// do some thing
}
person Community    schedule 06.03.2018
comment
Это помогло. Теперь я могу сделать резервную копию моего файла .db в каталог «Документы», а затем загрузить его на Google Диск. Затем я удаляю .db из / data / data и восстанавливаю его из каталога Download. - person Programming Padawan; 07.03.2018

В обратном вызове логики вы должны вызвать ту же логику, что и раньше, просто добавив причину, по которой пользователь должен действительно, действительно разрешить это разрешение :-) Покажите Toast или, может быть, AlertDialog, а затем снова запустить запрос разрешения. Если вы перейдете в диалог, запросите разрешение, как только пользователь отклонит Dialog.

Если пользователь отказывает снова, вы не должны запрашивать снова. Пользователь может решить, что они хотят включить его в конце концов через Настройки, но в целом они думают, что вы не заслуживаете разрешения :-(

person Kelevandos    schedule 06.03.2018

1- Если под on the second run through вы имеете в виду, что пользователю было отказано в вашем запросе на разрешение несколько секунд назад, в зависимости от вашей реализации вам не нужно напрямую вызывать requestPermissions внутри блока shouldShowRequestPermissionRationale if (), потому что пользователь отклонил ваш запрос один раз, и вы должны уважать его / ее решение. Если shouldShowRequestPermissionRationale вернул истинное значение, вы можете просто показать какой-нибудь диалог / тост или закусочную, чтобы объяснить пользователю, почему вам нужно это разрешение, и вы можете предоставить некоторые методы для повторного запроса разрешения внутри этого диалога / закусочной, например, кнопку grant access для вызова requestPermissions снова, но поскольку пользователь щелкнул, он основан на запросе пользователя и не запускается автоматически внутри блока if (). Если shouldShowRequestPermissionRationale вернул false, вы просто изменяете процесс своего приложения так, чтобы оно могло продолжаться без этого разрешения, например, остановите или покажите отключенное представление, чтобы сообщить пользователю из-за его / ее решения о разрешении, эта функция больше не доступна.

2- Вы должны показать пользователю причину запроса разрешения в вашем настраиваемом пользовательском интерфейсе в зависимости от дизайна вашего приложения. Вы можете использовать диалоговые окна предупреждений или панели закусок. Однако диалоговые окна с предупреждениями являются обычным явлением, поскольку они блокируют другие элементы пользовательского интерфейса, которые не предлагаются с точки зрения взаимодействия с пользователем.

Вы можете взглянуть на источник образцов, предоставленный google здесь и здесь. Предлагаю взглянуть на этот вопрос и его ответ и его первый комментарий, который может дать вам хорошее понимание.

person VSB    schedule 06.03.2018