无法一次请求多个危险权限

3

我正在开发一个收集数据以进行处理的应用程序,因此它需要多个危险权限(即ACCESS_FINE_LOCATIONREAD_PHONE_STATE)。目前应用程序请求其中一个权限后就崩溃了。

我尝试使用ActivityCompat.requestPermissions单独请求权限,并尝试将这两个权限都放在数组中请求。我还尝试过在请求代码中使用0、1和7,因为我在解决类似问题时看到这些代码被使用,但是没有任何改变。

 private void setupPermissions() {
        ArrayList<String> permissions = new ArrayList<>();
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (permissions.size()>0){
            ActivityCompat.requestPermissions(getActivity(), permissions.toArray(new String[permissions.size()]), 7);
        }
    }

预期结果:

  • 第一次打开应用程序时,应请求两个权限,可以通过两个单独的对话框(一个接一个)或多页对话框来实现。
  • 然后应按预期运行应用程序。

实际结果:

  • 请求第一个权限。
  • 允许您继续使用应用程序。
  • 当您尝试使用需要第二个权限的功能时,应用程序崩溃。
  • 重新打开应用程序。
  • 请求第二个权限。
  • 允许应用程序像往常一样继续运行。

1
请在此处粘贴onRequestPermissionsResult()代码 - Zeeshan Shabbir
你的目标 SDK 版本是什么? - dustblue
2个回答

1

请尝试以下代码{{link1:(来自此答案)}}

public static boolean hasPermissions(Context context, String... permissions) {
    if (context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != 
                PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;

}
int PERMISSION_ALL = 1; 
String[] PERMISSIONS = {
  android.Manifest.permission.ACCESS_FINE_LOCATION, 
  android.Manifest.permission.READ_PHONESTATE
};

if(!hasPermissions(this, PERMISSIONS)){
    ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}

1

每当您需要权限时,请调用checkAndRequestPermissions()方法。

private boolean checkAndRequestPermissions() {

    int ACCESS_FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    int READ_PHONE_STATE = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);

    List<String> listPermissionsNeeded = new ArrayList<>();

    if (READ_PHONE_STATE != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
    }
    if (ACCESS_FINE_LOCATION != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }

    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray
                (new String[listPermissionsNeeded.size()]), 101);
        return false;
    }
    return true;
}

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