Как избежать requestPermission (), если пользователь установил флажок «Никогда не спрашивать»? - PullRequest
0 голосов
/ 30 мая 2018

Я имею дело с разрешениями по требованию в Android, и я обнаружил спорную ситуацию.Моя цель - отобразить диалоговое окно с кнопкой «Перейти к настройкам приложения», если пользователь выбрал «Никогда не спрашивать» в разрешении.

ОК, если пользователь выбрал «Никогда не спрашивать», затем, следующийКогда вы запрашиваете разрешение, вы можете знать, что это происходит в методе onRequestPermissionsResult

public boolean checkIfShouldShowGoToSettingsDialog(String permissions[], int[] grantResults){
    for (int i=0; i<permissions.length; i++){
        if (grantResults[i] == PackageManager.PERMISSION_DENIED && !ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permissions[i])) {
            return true;
        }
    }
    return false;
}

Проблема в том, что если вы делаете это, каждый раз, когда вы звоните requestPermission(), то onRequestPermissionsResultвызывается снова, даже если ранее было отказано в разрешении, и даже с установленным флажком.Таким образом, checkIfShouldShowGoToSettingsDialog возвращает true, потому что разрешение DENIED, а shouldShowRequestPermissionRationale возвращает false.Я не хочу этогоЯ хочу отобразить диалоговое окно «Перейти к настройкам приложения» только в первый раз, когда пользователь выбрал «Больше не спрашивать».

Итак, я попробовал кое-что:

Я добавил эту проверку перед вызовом requestPermission().Я попытался удалить разрешения, которые возвращают false методу shouldShowRequestPermissionRationale(), поскольку предполагается, что для этих разрешений установлен флажок:

public String[] removePermanentlyDeniedPermissionsFromArray(String[] permissions){
    List<String> result = new ArrayList<>();
    for (String permission : permissions) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permission)) {
            result.add(permission);
        }
    }
    return result.toArray(new String[result.size()]);
}

Он работал отлично, но ... проблема в том, что при первом открытииприложение, в первый раз, когда вы собираетесь запросить разрешения ... shouldShowRequestPermissionRationale () возвращает FALSE для всех из них !!поэтому никаких разрешений не запрашивается.

Тогда, как мне избежать callrequestPermission (), если пользователь установил флажок "Никогда не спрашивать"?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Так что здесь неправильное использование shouldShowPermissionRationale.Это верно, если в разрешении было отказано ранее (без установки флажка).Впервые это всегда ложно.Проверьте документ

/**
     * Gets whether you should show UI with rationale for requesting a permission.
     * You should do this only if you do not have the permission and the context in
     * which the permission is requested does not clearly communicate to the user
     * what would be the benefit from granting this permission.
     * <p>
     * For example, if you write a camera app, requesting the camera permission
     * would be expected by the user and no rationale for why it is requested is
     * needed. If however, the app needs location for tagging photos then a non-tech
     * savvy user may wonder how location is related to taking photos. In this case
     * you may choose to show UI with rationale of requesting this permission.
     * </p>
     *
     * @param activity The target activity.
     * @param permission A permission your app wants to request.
     * @return Whether you can show permission rationale UI.
     *
     * @see #checkSelfPermission(android.content.Context, String)
     * @see #requestPermissions(android.app.Activity, String[], int)
     */

Процесс для запроса разрешения во время выполнения

1.Создайте список разрешений, которые не предоставляются.

List<String> permissionList = new ArrayList<>()
if(somePermission == PackageManager.PERMISSION_DENIED){
   permissionList.add(somePermission);
}
//so on
String[] permissionArray = permissionList.toArray(new String[permissionArray.size()]);

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

3. Запросите разрешение у сгенерированного выше массива.

4.В случаеразрешение запрещено, перенаправьте пользователя на экран настроек, если разрешение является обязательным для запуска приложения.

Рекомендация:

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

0 голосов
/ 30 мая 2018

Я очень рад ответить на ваши вопросы.В моих прошлых проектах я также сталкивался с подобными проблемами.Следующее моё решение.(1) Чтобы избежать дублирования запросов, мы должны сохранить успешный токен, когда пользователь впервые согласится.Дождитесь следующей операции, сначала определите, согласился ли пользователь, если вы согласились, то больше не запрашивайте.В противном случае, запросите пользователя снова.(2) Здесь нам нужно использовать среду с открытым исходным кодом для быстрого сохранения тегов напоминания.Зачем использовать этот фреймворк?Потому что у него есть метод, который может установить срок действия тега напрямую.Конкретное использование можно посмотреть здесь: https://github.com/yangfuhai/ASimpleCache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...