Android API 23 запрашивает несколько разрешений

#android #android-permissions

#Android #android-разрешения

Вопрос:

Я пытаюсь запросить разрешения для своей активности запуска. Для API <23 он работает идеально. Однако, когда я тестирую приложение на устройстве с API 23, оно сообщает: «Постоплатный баланс остановлен». Я нажимаю кнопку «Закрыть приложение», приложение закрывается и немедленно запрашивает одно разрешение. Я нажимаю принять. Затем я нажимаю на значок приложения, чтобы снова открыть, и происходит то же самое, за исключением того, что теперь он запрашивает следующее разрешение. Затем я нажимаю на значок приложения и на этот раз выполняется правильно. Похоже, что он запрашивает разрешения по одному за раз. Есть идеи о том, как это сделать?

 // Below code is implemented on onCreate() of the launcher activity.
 if (Build.VERSION.SDK_INT < 23) {
        ActivityCompat.checkSelfPermission(this.getApplicationContext(), "android.permission.READ_SMS");
        ActivityCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.READ_CALL_LOG);
        ActivityCompat.checkSelfPermission(this.getApplicationContext(), Manifest.permission.READ_PHONE_STATE);

        if ((ActivityCompat.checkSelfPermission(this, "android.permission.READ_SMS") != PackageManager.PERMISSION_GRANTED)) {
            requestSmsPermission();
        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            requestPhoneStatePermission();
        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
            requestCallLogPermission();
        }
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if ((this.checkSelfPermission("android.permission.READ_SMS") != PackageManager.PERMISSION_GRANTED) amp;amp;
                (this.checkSelfPermission(Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) amp;amp;
                (this.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)) {
            this.requestPermissions(new String[]{"android.permission.READ_SMS", Manifest.permission_group.PHONE}, REQUEST_SMS);

        }
    }
  

введите описание изображения здесь

Комментарии:

1. Запрашивайте все три разрешения за один requestPermissions() вызов. Кроме того, неясно, почему ваш код настроен на выполнение разных действий в зависимости от уровня API. ActivityCompat и ContextCompat обратно совместимы.

2. Я настраиваю код для выполнения разных действий, потому что некоторые функции не будут доступны для API <23.

3. Что бы вы порекомендовали? Должен ли я запрашивать разрешения только в том случае, если API равен 23, и игнорировать if(API < 23)?

4. «Я настраиваю код для выполнения разных действий, потому что некоторые функции не будут доступны для API <23» — ах, ХОРОШО. Ваш текущий код этого не показывает. «Должен ли я запрашивать разрешения только в том случае, если API равен 23, и игнорировать if(API < 23) ?» — ну, вы знаете, что нет разрешений во время выполнения < 23, поэтому нет смысла запускать код, запрашивающий их.

5. да, вы правы! Я совершенно забыл о разрешениях в API < 23.

Ответ №1:

Чтобы ответить на ваш вопрос о том, как запросить несколько разрешений за один раз, добавьте разрешения в свой массив строк. В этом примере я хочу запросить разрешения для READ_PHONE_STATE и WRITE_EXTERNAL_STORAGE:

 ArrayList<String> arrPerm = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.READ_PHONE_STATE);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!arrPerm.isEmpty()) {
    String[] permissions = new String[arrPerm.size()];
    permissions = arrPerm.toArray(permissions);
    ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
}
  

Теперь проверьте, какие разрешения были предоставлены:

 @Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0) {
                for(int i = 0; i < grantResults.length; i  ) {
                    String permission = permissions[i];
                    if(Manifest.permission.READ_PHONE_STATE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                    if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                }
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
        }
    }

    // other 'case' lines to check for other
    // permissions this app might request
}