2016-09-13 3 views
0

Я хочу попросить пользователя принять следующие разрешения одновременно (один за другим), разрешения равны: checkLocationPermission, checkReadSMS, checkCallingPermission, checkReadState , checkContactWriteState. Итак, как я могу задать все эти разрешения на моем первом экране. Пожалуйста, помогите мне в этом. Спасибо заранее.Как задать несколько разрешений одновременно в android 6.0+

+0

Это невозможно. –

+0

Ya shabbir Dhangot, я думаю, его возможно, пожалуйста, помогите мне в этом отношении. Спасибо за ваш комментарий. –

+0

Если вы хотите его одним выстрелом, это невозможно. Это обновление связано с тем, что пользователь узнает, что вы хотите получить это разрешение. Вы можете запросить все разрешения один за другим. Но одно разрешение для всех разрешений в обновлении 6.0 невозможно. –

ответ

1

Вы должны сначала проверить эту версию пользовательского телефона сборка 23.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    askPermissions(true); 
} else { 
    startActivity(new Intent(PermissionsActivity.this, SplashActivity.class)); 
    finish(); 
} 

Если версия 23 тогда вам нужно спросить разрешения.

private void askPermissions(boolean isForOpen) { 
    isRationale = false; 
    List permissionsRequired = new ArrayList(); 

    final List<String> permissionsList = new ArrayList<String>(); 
    if (!checkPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) 
     permissionsRequired.add("Write External Storage"); 
    if (!checkPermission(permissionsList, Manifest.permission.CALL_PHONE)) 
     permissionsRequired.add("Call phone"); 
    if (!checkPermission(permissionsList, Manifest.permission.READ_PHONE_STATE)) 
     permissionsRequired.add("Read phone state"); 
    if (!checkPermission(permissionsList, Manifest.permission.READ_CONTACTS)) 
     permissionsRequired.add("Read Contacts"); 
    if (!checkPermission(permissionsList, Manifest.permission.RECEIVE_SMS)) 
     permissionsRequired.add("Receive SMS"); 
    if (!checkPermission(permissionsList, Manifest.permission.GET_ACCOUNTS)) 
     permissionsRequired.add("Get Accounts"); 
    if (!checkPermission(permissionsList, Manifest.permission.ACCESS_COARSE_LOCATION)) 
     permissionsRequired.add("Location"); 
    if (!checkPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION)) 
     permissionsRequired.add("Location"); 

    if (permissionsList.size() > 0 && !isRationale) { 
     if (permissionsRequired.size() > 0) { 

     } 
     if (isForOpen) { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]), 
         11); 
      } 
     } 

    } else if (isRationale) { 
     if (isForOpen) { 

      new android.support.v7.app.AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle) 
        .setTitle("Permission Alert") 
        .setMessage("You need to grant permissions manually. Go to permission and grant all permissions.") 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
          Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
          Uri uri = Uri.fromParts("package", getPackageName(), null); 
          intent.setData(uri); 
          startActivityForResult(intent, 123); 
         } 
        }) 
        .show(); 
     } 
    } else { 
     startActivity(new Intent(PermissionsActivity.this, SplashActivity.class)); 
     finish(); 
    } 
} 

private boolean checkPermission(List permissionsList, String permission) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { 
      permissionsList.add(permission); 
      // Check for Rationale Option 
      if (!isFirst) { 
       if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { 
        isRationale = true; 
        return false; 
       } 
      } 
     } 
    } 
    return true; 
} 

на onRequestPermissionsResult вам нужно проверить, какие права предоставляются

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 11: 
      Map<String, Integer> perms = new HashMap<String, Integer>(); 
      // Initial 
      perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.CALL_PHONE, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_PHONE_STATE, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.RECEIVE_SMS, PackageManager.PERMISSION_GRANTED); 
      // Fill with results 
      for (int i = 0; i < permissions.length; i++) { 
       perms.put(permissions[i], grantResults[i]); 
      } 
      // Check for ACCESS_FINE_LOCATION 
      if (perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && 
        perms.get(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED && 
        perms.get(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED && 
        perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && 
        perms.get(Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED) { 
       // All Permissions Granted 
       startActivity(new Intent(PermissionsActivity.this, SplashActivity.class)); 
       finish(); 
      } else { 
       // Permission Denied 
       Toast.makeText(this, "Some Permission is Denied.", Toast.LENGTH_SHORT) 
         .show(); 
       isFirst = false; 
       askPermissions(true); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    } 
} 

Если пользователь установил разрешение никогда не спрашивать снова, то экран настройки приложения откроется. Пользователь разрешит/разрешит разрешение. Вам нужно еще раз проверить активность.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    askPermissions(true); 
} 
-1
if (!hasPermissions()){ 
         // your app doesn't have permissions, ask for them. 
         requestNecessaryPermissions(); 
        } 
        else { 
         // your app already have permissions allowed. 
         // do what you want. 
        } 


private boolean hasPermissions() { 
     int res = 0; 
     // list all permissions which you want to check are granted or not. 
     String[] permissions = new String[] {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 
     for (String perms : permissions){ 
      res = checkCallingOrSelfPermission(perms); 
      if (!(res == PackageManager.PERMISSION_GRANTED)){ 
       // it return false because your app dosen't have permissions. 
       return false; 
      } 

     } 
     // it return true, your app has permissions. 
     return true; 
    } 

    private void requestNecessaryPermissions() { 
     // make array of permissions which you want to ask from user. 
     String[] permissions = new String[] {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      // have arry for permissions to requestPermissions method. 
      // and also send unique Request code. 
      requestPermissions(permissions, REQUEST_CODE_STORAGE_PERMS); 
     } 
    } 

    /* when user grant or deny permission then your app will check in 
     onRequestPermissionsReqult about user's response. */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grandResults) { 
     // this boolean will tell us that user granted permission or not. 
     boolean allowed = true; 
     switch (requestCode) { 
      case REQUEST_CODE_STORAGE_PERMS: 
       for (int res : grandResults) { 
        // if user granted all required permissions then 'allowed' will return true. 
        allowed = allowed && (res == PackageManager.PERMISSION_GRANTED); 
       } 
       break; 
      default: 
       // if user denied then 'allowed' return false. 
       allowed = false; 
       break; 
     } 
     if (allowed) { 
      // if user granted permissions then do your work. 
      dispatchTakePictureIntent(); 
     } 
     else { 
      // else give any custom waring message. 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { 
        Toast.makeText(MainActivity.this, "Camera Permissions denied", Toast.LENGTH_SHORT).show(); 
       } 
       else if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){ 
        Toast.makeText(MainActivity.this, "Storage Permissions denied", Toast.LENGTH_SHORT).show(); 
       } 
      } 

     } 
    } 

этого руководство, в этом руководстве разрешение кратного просит

Android 6.0 Runtime Permissions

Смежные вопросы