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

    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.SEND_SMS},
            1);
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
            2);
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CALL_PHONE},
            3);

Здесь у меня есть три разрешения, которые я хочу. Однако, когда приложение появляется, появляется только одно из трех разрешений. Как получить все три разрешения на запрос?


person Jackson Ennis    schedule 03.04.2018    source источник
comment
Обратитесь к моему ответу: - stackoverflow.com/questions/32854169/   -  person MashukKhan    schedule 03.04.2018


Ответы (3)


Это асинхронный вызов, и возможно много вызовов. Следовательно, должен быть ключ, позволяющий различать их. Вы будете использовать его в

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // Your code here
        }
    }
}

В этом случае MY_PERMISSIONS_REQUEST_READ_CONTACTS является значением int, и вы можете определить его. Например:

int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 999;
person Cao Minh Vu    schedule 03.04.2018
comment
Спасибо. однако, когда я пытаюсь сделать это с несколькими разрешениями, появляется только одно. IE - person Jackson Ennis; 03.04.2018
comment
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, 1); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 2); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 3); - person Jackson Ennis; 03.04.2018
comment
Только одно диалоговое окно появляется для одного из трех разрешений - person Jackson Ennis; 03.04.2018
comment
Да, это для лучшего UX. Что произойдет, если конечные пользователи примут первое разрешение, но откажутся от второго? Вам понадобится ключ, чтобы узнать, какой из них был отклонен - person Cao Minh Vu; 03.04.2018
comment
извините, я имею в виду, что запрашивается только одно разрешение - person Jackson Ennis; 03.04.2018
comment
Попробуйте следующее: ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.CALL_PHONE}, 1); - person Cao Minh Vu; 04.04.2018

Попробуйте с этим кодом:

 public void requestAppPermissions(final String[] requestedPermissions,
                                      final int requestCode, setPermissionListener listener) {
        this.permissionListener = listener;
        int permissionCheck = PackageManager.PERMISSION_GRANTED;
        for (String permission : requestedPermissions) {
            permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);
        }
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, requestedPermissions, requestCode);
        } else {
            if (permissionListener != null) permissionListener.onPermissionGranted(requestCode);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
                if (permissionListener != null) permissionListener.onPermissionGranted(requestCode);
                break;
            } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
                if (permissionListener != null) permissionListener.onPermissionDenied(requestCode);
                break;
            } else {
                if (permissionListener != null)
                    permissionListener.onPermissionNeverAsk(requestCode);
                break;
            }
        }
    }


    public interface setPermissionListener {
        void onPermissionGranted(int requestCode);

        void onPermissionDenied(int requestCode);

        void onPermissionNeverAsk(int requestCode);
    }

вызов:

private void askPermission() {
        requestAppPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION},
                Constants.PERMISSION_STORAGE,
                new setPermissionListener() {
                    @Override
                    public void onPermissionGranted(int requestCode) {
                        selectImageDialog();
                    }

                    @Override
                    public void onPermissionDenied(int requestCode) {
                        showSnackbar(mBinder.getRoot(), getString(R.string.critical_permission_denied),
                                Snackbar.LENGTH_INDEFINITE, getString(R.string.allow), new OnSnackbarActionListener() {
                                    @Override
                                    public void onAction() {
                                        askPermission();
                                    }
                                });
                    }

                    @Override
                    public void onPermissionNeverAsk(int requestCode) {
                        showPermissionSettingDialog(getString(R.string.need_permission));
                    }
                });
    }
person Deep Patel    schedule 03.04.2018

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

fun verifyPermissions(activity: Activity?) {
    var permissions = mutableListOf<String>()
    // Check if we have SEND_SMS permission
    if (ActivityCompat.checkSelfPermission(
            activity!!,
            Manifest.permission.SEND_SMS
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        permissions.add(Manifest.permission.READ_CONTACTS)
    } else {
        // permission granted
    }
    if (ActivityCompat.checkSelfPermission(
            activity,
            Manifest.permission.ACCESS_COARSE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        permissions.add(Manifest.permission.READ_CALL_LOG)
    } else {
        // permission granted
    }
    // continue to add other permissions
    if (!permissions.isEmpty()) {
        ActivityCompat.requestPermissions(
            activity, permissions.toTypedArray(),
            REQUEST_CODE
        )
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    var counter: Int = 0
    when (requestCode) {
        REQUEST_CODE -> if ((grantResults.isNotEmpty())) {
            while (counter < NUM_OF_PERM) {
                if (grantResults[counter++] == PackageManager.PERMISSION_GRANTED) {
                    // permission granted
                }
            }
        }
    }
}
person Lana    schedule 28.12.2020