Запрашивать разрешение во время выполнения только один за другим, а не сразу в массиве

В onCreate() моей деятельности я проверяю разрешения.

 if (ContextCompat.checkSelfPermission(this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);
}


if (ContextCompat.checkSelfPermission(this,
        Manifest.permission.CHECK_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);

}

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

String[] permissions { };

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

 case ConstantClass.READ_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
              doSomething();
                    Toast.makeText(MainActivity.this, getResources().getString(R.string.Cannot_Vibrate_Phone), Toast.LENGTH_LONG).show();
                }
                break;

            case ConstantClass.CALL_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    dialPhoneNumber();
                } else {
                    Toast.makeText(MainActivity.this, getString(R.string.permission_access_call), Toast.LENGTH_LONG).show();
                }
                break;

Если я запрошу эти разрешения одно за другим в onCreate(). Отображается только первое разрешение. Поэтому у меня работает только один обратный вызов. Итак, как добиться сценария, чтобы для каждого отдельного разрешения я получал отдельный обратный вызов и вызывал в них некоторые функции. Спасибо :)


person Pritish    schedule 13.04.2017    source источник
comment
попробуйте вызвать разрешение из onpermissionResult   -  person Divyesh Patel    schedule 13.04.2017
comment
Это может быть решением, если у меня есть только пара разрешений, что, если у меня их несколько, то это будет означать, что при каждом обратном вызове я должен синхронно проверять каждое разрешение, независимо от того, принял его пользователь или отклонил. Может ли быть более изящный решение ?   -  person Pritish    schedule 13.04.2017
comment
Вы хотите запрашивать все разрешения одно за другим или по мере выполнения действия, связанного с этим разрешением?   -  person Suraj Makhija    schedule 13.04.2017
comment
@SurajMakhija Нет, сразу после начала действия мне нужно спросить их, в основном мои разрешения относятся к идентификатору устройства и диспетчеру рингтонов. Поэтому, как только начинается действие, я вызываю регистрационный API в Activty и другой API во фрагменте. Поэтому мне нужно спрашивать их один за другим, и они не зависят друг от друга.   -  person Pritish    schedule 13.04.2017


Ответы (3)


Проверьте этот демо-код

Запросить следующее разрешение в ответ на отказ/предоставление первого разрешения в onRequestPermissionsResult()

public class MainActivity extends Activity {

    private Context context;
    private static final int REQUEST_RUNTIME_PERMISSION_1 = 111;
    private static final int REQUEST_RUNTIME_PERMISSION_2 = 222;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = this;
        if (CheckPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // you have permission go ahead
        } else {
            // you do not have permission go request runtime permissions
            RequestPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION_1);
        }
    }

    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions,
                                           int[] grantResults) {
        switch (permsRequestCode) {
            case REQUEST_RUNTIME_PERMISSION_1: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // you have permission go ahead ask next permission and get separate callback
                    RequestPermission(MainActivity.this, Manifest.permission.CAMERA, REQUEST_RUNTIME_PERMISSION_2);
                } else {
                    // you do not have permission show toast.
                    /*check your logic ask again*/
                    //RequestPermission(MainActivity.this, Manifest.permission.CAMERA, REQUEST_RUNTIME_PERMISSION_2);
                }
                return;
            }
            case REQUEST_RUNTIME_PERMISSION_2: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // you have 2nd permission go ahead
                } else {
                    // you do not have 2nd permission show toast.
                }
                return;
            }
        }
    }

    public void RequestPermission(Activity thisActivity, String Permission, int Code) {
        if (ContextCompat.checkSelfPermission(thisActivity,
                Permission)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Permission)) {
            } else {
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Permission},
                        Code);
            }
        }
    }

    public boolean CheckPermission(Context context, String Permission) {
        if (ContextCompat.checkSelfPermission(context,
                Permission) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
}
person Sohail Zahid    schedule 13.04.2017
comment
Это нормально, если есть только пара разрешений, но скажем, их много, тогда мне нужно продолжать проверять их при каждом обратном вызове для каждого успеха и неудачи, и код будет циклическим. Хотя это может быть одним из решений. - person Pritish; 13.04.2017
comment
да, вы должны настроить свою логику в соответствии с вашими потребностями. - person Sohail Zahid; 13.04.2017
comment
@Pritish Согласно вашему сценарию, приведенное выше решение должно работать нормально. - person Suraj Makhija; 13.04.2017
comment
@SurajMakhija да, но я искал более универсальное решение с учетом будущих этапов моего приложения. - person Pritish; 13.04.2017

Вы можете запросить следующее разрешение в onRequestPermission, чтобы показывать запросы на разрешение один за другим. Вы можете изучить приведенный ниже код и получить представление. В методе onRequestPermissionResult:

case ConstantClass.READ_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
              doSomething();
                    Toast.makeText(MainActivity.this, getResources().getString(R.string.Cannot_Vibrate_Phone), Toast.LENGTH_LONG).show();
                }
                // Ask for Camera permission
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.CHECK_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
                break;

Надеюсь это поможет.

person tahsinRupam    schedule 13.04.2017

    String permissions[] = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET};


    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
            &&ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ){
        ActivityCompat.requestPermissions(this, permissions, ALL_REQUEST_CODE);
    }
    else if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[] {permissions[1], permissions[2], permissions[3]}, ALL_REQUEST_CODE);
    }
    else if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[] {permissions[2], permissions[3]}, ALL_REQUEST_CODE);
    }

Это лучший способ получить разрешения

person Pranav Baurasia    schedule 16.10.2018