2016-10-01 5 views
1

Я пытаюсь запросить разрешения для моей деятельности Launcher. Для API < 23 он отлично работает. Однако, когда я тестирую приложение на устройстве, использующем API 23, он говорит: «PostPaid Balance остановлен». Я нажал кнопку «закрыть приложение», приложение закрывается и сразу же запрашивает одно разрешение. Я ударил. Затем я нажимаю значок приложения для повторного открытия и происходит то же самое, за исключением того, что теперь он запрашивает следующее разрешение. Затем я нажимаю значок приложения, и на этот раз выполняется правильно. Кажется, что он запрашивает разрешения по одному за раз. Любые идеи о том, как это сделать?Android 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) && 
       (this.checkSelfPermission(Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) && 
       (this.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)) { 
      this.requestPermissions(new String[]{"android.permission.READ_SMS", Manifest.permission_group.PHONE}, REQUEST_SMS); 

     } 
    } 

enter image description here

+1

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

+0

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

+0

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

ответ

2

Чтобы ответить на ваш вопрос о том, как запросить для нескольких разрешений на одном дыхании, добавить разрешения в массив строк. В этом примере я хочу просить разрешения на 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 
} 
Смежные вопросы