问题描述
我具有以下权限:
private static final String[] LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,};
我尝试在下面的代码行中请求权限(活动是我当前的活动参考):
ActivityCompat.requestPermissions(activity,LOCATION_PERMISSIONS,1);
如果我的build.gradle文件中有targetSdkVersion 29
或更低的版本,则一切正常。出现权限对话框,我可以在其中按按钮来授予权限。一切都很好
但是!在将目标sdk更改为Android 11之后:targetSdkVersion 30
,此功能停止工作。
权限系统对话框没有出现-我无法为我的应用授予位置权限。
那么有人可以帮助我吗?我怎么了 我应该更改我的代码中的哪些内容-以正确使用Android 11?
现在使用targetSdkVersion 29
,我也可以在android 11模拟器下运行我的应用程序。也许我根本不应该将目标sdk版本增加到:30吗?
解决方案是:
1步。该应用程序应请求前台位置权限:
private static final String[] FOREGROUND_LOCATION_PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,// GPS
Manifest.permission.ACCESS_COARSE_LOCATION,// GPS approximate location
};
2步。该应用程序应请求后台位置权限:
@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);
如果我首先尝试请求后台许可-它将无法工作。
解决方法
在android 11上,您不能同时请求前台和后台位置权限,此类请求被视为无效:
如果您的应用定位到Android 11(API级别30)或更高版本,则系统 实施此最佳做法。如果您要求前台位置 权限和后台位置权限同时使用, 系统会忽略该请求,也不会授予您的应用程序 许可。