如何依次请求多个权限?

How to ask for multiple permissions one after another?

我的应用程序需要访问 CAMERAWRITE_EXTERNAL_STORAGE 权限。

我的应用程序加载后,我想要求用户一个接一个地允许这两个权限。我有这个代码:

    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.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {

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

    }

现在,一旦我的应用加载,它会请求第一个许可,但在我再次重新加载整个应用之前不会请求第二个许可。

如何在应用加载后向用户请求这两项权限?

您可以在 requestPermissions() 中请求多个权限。它需要一组权限名称,而不仅仅是一个权限。

不过请注意,即使您已经拥有该权限,系统也会要求您包含在该数组中的任何内容。

所以,你可以这样做:

  private static final String[] PERMS_TAKE_PICTURE={
    CAMERA,
    WRITE_EXTERNAL_STORAGE
  };

  private void gimmePermission() {
    if (!canTakePicture()) {
      ActivityCompat.requestPermissions(this,
        netPermissions(PERMS_TAKE_PICTURE), RESULT_PERMS_TAKE_PICTURE);
    }
  }

  private boolean hasPermission(String perm) {
    return(ContextCompat.checkSelfPermission(this, perm)==
      PackageManager.PERMISSION_GRANTED);
  }

  private boolean canTakePicture() {
    return(hasPermission(CAMERA) && hasPermission(WRITE_EXTERNAL_STORAGE));
  }

  private String[] netPermissions(String[] wanted) {
    ArrayList<String> result=new ArrayList<String>();

    for (String perm : wanted) {
      if (!hasPermission(perm)) {
        result.add(perm);
      }
    }

    return(result.toArray(new String[result.size()]));
  }

netPermissions() 获取您想要的 String[] 权限和 returns 您尚未持有的 String[] 权限,然后您可以传递这些权限至 requestPermissions().

(代码源自 this sample app

您必须将所有权限放入一个 String 数组中:

new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}

这样,用户将看到一个包含所有权限的对话框,他们可以决定单独拒绝或授予每个权限。一旦完成,您的 Activity 将被调用 onRequestPermissionsResult()

此方法的一个参数是名为 grantResultsint 类型数组,您可以对其进行计算以了解授予了哪些权限。