我的应用需要访问 CAMERA 和 WRITE_EXTERNAL_STORAGE 权限。
我的应用加载后,我想让用户一个接一个地允许这两个权限。我有这段代码:
for {
opedV1 <- op(v1)
opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)
现在,一旦我的应用加载它就会要求获得第一个权限,但在我再次重新加载整个应用之前,从不要求第二个权限。
如果应用加载,我如何向用户提出这两种权限?
答案 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
类型的数组,您可以评估该数组以了解授予了哪些权限。