如何依次请求多个权限?
How to ask for multiple permissions one after another?
我的应用程序需要访问 CAMERA 和 WRITE_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()
。
此方法的一个参数是名为 grantResults 的 int
类型数组,您可以对其进行计算以了解授予了哪些权限。
我的应用程序需要访问 CAMERA 和 WRITE_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()
。
此方法的一个参数是名为 grantResults 的 int
类型数组,您可以对其进行计算以了解授予了哪些权限。