如何依次请求多个权限?

7

我的应用需要访问相机写入外部存储权限。

一旦我的应用程序加载,我希望依次询问用户是否允许这两个权限。我有以下代码:

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

    }

现在,一旦我的应用程序加载,它会要求第一个权限,但直到我再次重新加载整个应用程序之前,它不会要求第二个权限。如何在应用程序加载时向用户请求这两个权限?

请检查此链接:http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en - Matcoil
2个回答

6

您需要将所有权限放入一个String数组中:

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

这样一来,用户将会看到一个对话框,其中包含所有的权限,他们可以决定是否单独拒绝或授权每个权限。一旦他们完成操作,你的 Activity 将被调用,并出现 onRequestPermissionsResult() 的结果。

该方法的参数之一是名为 grantResultsint 类型数组,您可以评估它以了解哪些权限已被授予。


@0X0nosugar:第一次请求权限时它完美地工作。如果我去设置并关闭其中一个权限(例如相机),然后打开应用程序,它会要求两个权限而不是一个。如何解决? - Madhan
@Madhan - "它要求两个权限"是因为你告诉它这样做 :) 一旦你注意到一个权限缺失,你可以只请求这个权限(如果用户没有选择退出被询问...)。我认为只显示一个新缺失权限的请求是一个好主意。否则,用户可能会决定撤回其他权限以进行更改。所以你需要确定要进行什么类型的请求。查找PermissionChecker,它非常有用。 - Bö macht Blau

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

(代码来自此示例应用程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接