我拥有以下权限:
private static final String[] LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
};
我尝试在我的代码中使用以下行来请求权限(activity 是当前活动的引用):
ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, 1);
如果我在 build.gradle 文件中设置 targetSdkVersion
为 29 或更低版本,一切都正常。权限对话框会出现,我可以点击其中的按钮来授予权限。一切都很好。
但是!当我将目标 sdk 更改为 Android 11: targetSdkVersion 30
后,这个功能就停止工作了。权限系统对话框不会出现,我无法为我的应用程序授予位置权限。
那么有谁能帮助我吗?我做错了什么?我应该在我的代码中做出哪些改变 - 才能正确地处理 Android 11?
现在,我可以在 Android 11 模拟器下运行我的应用程序,只要将 targetSdkVersion
设置为 29 即可。也许我根本不需要将目标 sdk 版本增加到:30?
解决方案如下:
步骤1:应用程序应请求前台位置权限:
private static final String[] FOREGROUND_LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION, // GPS
Manifest.permission.ACCESS_COARSE_LOCATION, // GPS approximate location
};
第二步:应用程序应请求后台定位权限:
@RequiresApi(api = Build.VERSION_CODES.Q)
private static final String[] BACKGROUND_LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
};
只有按照这个顺序!
ActivityCompat.requestPermissions(activity, FOREGROUND_LOCATION_PERMISSIONS, 1);
// Check the first statement grant needed permissions, and then run the second line:
ActivityCompat.requestPermissions(activity, BACKGROUND_LOCATION_PERMISSIONS, 1);
如果我首先尝试请求后台权限 - 这将不起作用。
如果我只请求后台权限(没有已授予的前台权限)- 这将不起作用。
我应该先请求前台权限,然后再逐个请求后台权限。