targetSdkVersion 30的ActivityCompat.requestPermissions无法正常运行

问题描述

我具有以下权限:

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)或更高版本,则系统 实施此最佳做法。如果您要求前台位置 权限和后台位置权限同时使用, 系统会忽略该请求,也不会授予您的应用程序 许可。

请参见Request location access at runtime