这是因为在 Android 10 或更高版本中,当您请求 BACKGROUND_LOCATION 权限时,系统会弹出一个新的对话框,要求用户明确授予此权限。如果您的应用在 manifest 文件中声明了此权限,并使用了 Manifest.permission.ACCESS_BACKGROUND_LOCATION,但未明确请求授权,或者设备上的用户已拒绝该权限,则在调用 requestPermissions API 时将看不到任何系统对话框。
为了解决此问题,您需要使用 shouldShowRequestPermissionRationale 方法,该方法将检查是否需要显示对话框来解释为什么需要该权限。如果需要,您可以使用 requestPermissions 方法来请求授权。
以下是示例代码:
private static final int MY_PERMISSIONS_REQUEST_LOCATION = 100;
private void checkLocationPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION)) {
// 显示权限请求对话框(可能会在此解释为何需要该权限)
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);
} else {
// 直接请求权限(此时无法再解释为何需要该权限)
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_LOCATION: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "已授权位置权限", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "未授权位置权限", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
在这里,我们首先检查应用是否已授予权限。如果权限未
上一篇:ActivityCompat.requestPermissions不显示ACCESS_FINE_LOCATION的权限对话框
下一篇:ActivityCompat.RequestPermissions总是立即返回,OnRequestPermissionsResult中的result为-1。