Разрешения Marshmallow должны запрашиваться только в том случае, если они еще не предоставлены

#android #android-studio #permissions #android-6.0-marshmallow #android-permissions

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

Вопрос:

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

пожалуйста, помогите мне написать код для этого, заранее спасибо!

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

1. Даже если в разрешении отказано, вы не хотите показывать его снова?

2. если это отрицается, то только это показывает, что в противном случае не @King

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

4. @Pratik просто нужно поставить галочку, если она уже предоставлена или нет

5. @king нужна ли мне SharedPreference?

Ответ №1:

Просто проверьте наличие разрешения и запрашивайте только при необходимости.

Проверьте разрешение с помощью

 checkSelfPermission(Manifest.permission.READ_CONTACTS)
  

Проверьте, предоставлено ли разрешение уже или нет

 if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}
  

Затем обработайте разрешение

 @Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! do the

        } else {
            // permission denied, Disable the
            // functionality that depends on this permission.
        }
        return;
    }
}}
  

Ответ №2:

система разрешений изменилась. Но вот хорошее объяснение, как с этим правильно справиться.

https://developer.android.com/training/permissions/requesting.html

Таким образом, диалоговое окно открывается только один раз, если пользователь предоставляет разрешение. Если он откажется, у вас есть возможность показать объяснение при следующем запросе разрешения.

У них также есть раздел с рекомендациями, который стоит прочитать:

https://developer.android.com/training/permissions/best-practices.html

Ответ №3:

 public Boolean marshmallowPermission(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkPermission()) {
            Toast.makeText(this,"Permission already granted.", Toast.LENGTH_SHORT).show();
        } else {
            requestPermission();
            //marshmallowRequest();
        }
    }
    return true;
}
@TargetApi(Build.VERSION_CODES.M)
public boolean checkPermission(){

    int phone= checkSelfPermission(android.Manifest.permission.CALL_PHONE);
    if (phone == PackageManager.PERMISSION_GRANTED ){
        return true;
    } else {
        return false;
    }
}

@TargetApi(Build.VERSION_CODES.M)
private void requestPermission(){

    if (shouldShowRequestPermissionRationale(android.Manifest.permission.CALL_PHONE)){

        Toast.makeText(this," Permission must be needed which allows you to access an app. Please allow  in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", this.getPackageName(), null);
        intent.setData(uri);
        this.startActivity(intent);

    } else {

        requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE},101);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this,"Permission Granted, Now you can access an app.",Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this,"Permission Denied, You cannot access call.", Toast.LENGTH_LONG).show();

            }
            break;
    }
}
  

Ответ №4:

Выполните следующие действия :

  • Создайте группу разрешений, к которым вам нужен доступ.
  • Передайте group / array для проверки предоставленного разрешения или нет

Пример кода для справки :

 public static boolean hasPermissions(Context context, String[]permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M amp;amp; context != null amp;amp; permissions != null) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
}
return true;
  

Приведенный выше код проверит вашу группу разрешений позже, передав их все, чтобы запросить один раз

 int PERMISSION_ALL = 1; 
//create all permissions array
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, //all your permissions};

//Now check whether permissions are granted or not
if(!hasPermissions(this, PERMISSIONS)){
   ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
  

Надеюсь, это сработает для вас.