我的应用程序(标记 API30)需要在后台收集精确位置。 它实际上需要:
WRITE_EXTERNAL_STORAGE
RECORD_AUDIO
ACCESS_FINE_LOCATION
ACCESS_BACKGROUND_LOCATION (API >= 29)
所以我设置了以下方法:
public void checkMMPerms() {
if (Build.VERSION.SDK_INT >= 23) {
int extraperm = 0;
String[] perms = new String[(Build.VERSION.SDK_INT >= 29) ? 4 : 3];
perms[0] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
perms[1] = Manifest.permission.RECORD_AUDIO;
perms[2] = Manifest.permission.ACCESS_FINE_LOCATION;
if (Build.VERSION.SDK_INT >= 29) {
perms[3] = Manifest.permission.ACCESS_BACKGROUND_LOCATION;
extraperm = checkSelfPermission(perms[3]);
}
if (checkSelfPermission(perms[0]) + checkSelfPermission(perms[1])
+ checkSelfPermission(perms[2]) + extraperm != PackageManager.PERMISSION_GRANTED)
requestPermissions(perms, 0);
else {
RECPerms = true;
GPSPerms = true;
}
}
}
这个方法的问题在于,即使用户没有拒绝权限,requestPermissions
也会返回 Deny。
如果我删除 perms[3]
行,也就是说,不要求 ACCESS_BACKGROUND_LOCATION
它工作正常:它要求 3 个权限,但位置设置为“仅在使用应用程序时允许”,正如预期的那样。
如果我添加了 ACCESS_BACKGROUND_LOCATION
perm,为什么不询问任何权限?
编辑:如果我在 Android 11 中不要求 Manifest.permission.ACCESS_FINE_LOCATION
,问题仍然存在。所以这也不起作用:
public void checkMMPerms() {
if (Build.VERSION.SDK_INT >= 23) {
String[] perms = new String[3];
perms[0] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
perms[1] = Manifest.permission.RECORD_AUDIO;
perms[2] = Manifest.permission.ACCESS_FINE_LOCATION;
if (Build.VERSION.SDK_INT >= 29) {
perms[2] = Manifest.permission.ACCESS_BACKGROUND_LOCATION;
}
if (checkSelfPermission(perms[0]) + checkSelfPermission(perms[1])
+ checkSelfPermission(perms[2]) != PackageManager.PERMISSION_GRANTED)
requestPermissions(perms, 0);
else {
RECPerms = true;
GPSPerms = true;
}
}
}