如何一个接一个地要求多个权限?

时间:2016-04-18 16:49:26

标签: android android-permissions

我的应用需要访问 CAMERA WRITE_EXTERNAL_STORAGE 权限。

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

for {
  opedV1 <- op(v1)
  opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)

现在,一旦我的应用加载它就会要求获得第一个权限,但在我再次重新加载整个应用之前,从不要求第二个权限。

如果应用加载,我如何向用户提出这两种权限?

2 个答案:

答案 0 :(得分:3)

您可以在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[]个权限,并返回您尚未保留的String[]个权限,然后您可以将这些权限传递给requestPermissions()

(代码来自this sample app

答案 1 :(得分:3)

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

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

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

此方法的一个参数是名为 grantResults int类型的数组,您可以评估该数组以了解授予了哪些权限。