多次调用requestPermissions,为什么对话框只出现一次?

requestPermissions is called multiple times, but why does the dialog only appear once?

    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);

到这里,我想要的三个权限都具备了。但是,当应用程序弹出时,只会弹出三个权限中的一个。如何获得所有三个请求权限?

这是一个异步调用,可能有很多调用。因此,应该有一把钥匙让你区分它们。您将在

中使用它
@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;

Try with this code:

 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);
    }

invocation:

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));
                    }
                });
    }

也可以使用数组存储需要的权限,然后调用一次请求所有权限。

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
                }
            }
        }
    }
}