以下是多个权限请求的详细示例:
应用程序在启动时需要2个权限。SEND_SMS和ACCESS_FINE_LOCATION(这两者都在manifest.xml中提到)。
我正在使用为处理Android Marshmallow之前版本而准备的Support Library v4,因此无需检查构建版本。
一旦应用程序启动,它就会一起请求多个权限。如果两个权限都被授予,则正常流程会继续。
![输入图像描述](https://istack.dev59.com/IlJOr.webp)
![输入图像描述](https://istack.dev59.com/Ev2uO.webp)
public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(checkAndRequestPermissions()) {
}
}
private boolean checkAndRequestPermissions() {
int permissionSendMessage = ContextCompat.checkSelfPermission(this,
Manifest.permission.SEND_SMS);
int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
List<String> listPermissionsNeeded = new ArrayList<>();
if (locationPermission != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(Manifest.permission.SEND_SMS);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
ContextCompat.checkSelfPermission(),ActivityCompat.requestPermissions()和ActivityCompat.shouldShowRequestPermissionRationale()是支持库的一部分。
如果一个或多个权限没有被授予,则ActivityCompat.requestPermissions()将请求授权,并将控制传递给onRequestPermissionsResult()回调方法。
您应该在onRequestPermissionsResult()回调方法中检查shouldShowRequestPermissionRationale()标志的值。
只有两种情况:
情况1:-任何时候用户点击拒绝权限(包括第一次),它都会返回true。因此,当用户拒绝时,我们可以显示更多解释并继续再次请求。
情况2:-仅当用户选择“不再询问”时,它才会返回false。在这种情况下,我们可以继续具有有限功能,并指导用户从设置中激活权限以获取更多功能,或者如果权限对于应用程序来说是微不足道的,我们可以完成设置。
情况-1
![enter image description here](https://istack.dev59.com/kjrb6.webp)
情况-2
![enter image description here](https://istack.dev59.com/qVfvE.webp)
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
Log.d(TAG, "Permission callback called-------");
switch (requestCode) {
case REQUEST_ID_MULTIPLE_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<>();
perms.put(Manifest.permission.SEND_SMS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
if (grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
if (perms.get(Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "sms & location services permission granted");
} else {
Log.d(TAG, "Some permissions are not granted ask again ");
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
showDialogOK("SMS and Location Services Permission required for this app",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
checkAndRequestPermissions();
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
}
});
}
else {
Toast.makeText(this, "Go to settings and enable permissions", Toast.LENGTH_LONG)
.show();
}
}
}
}
}
}
private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", okListener)
.create()
.show();
}