targetSdkVersion 30 的 ActivityCompat.requestPermissions 不起作用

Rus*_*hts 5 android targetsdkversion

我有以下权限:

private static final String[] LOCATION_PERMISSIONS = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_BACKGROUND_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
};
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下行在我的代码中请求权限(活动是我当前的活动引用):

ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, 1);
Run Code Online (Sandbox Code Playgroud)

如果targetSdkVersion 29我的 build.gradle 文件中有或更低,一切正常。权限对话框出现,我可以按下按钮来授予权限。一切都很好

但!在我将目标 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
    };
Run Code Online (Sandbox Code Playgroud)

第 2 步:应用程序应请求后台位置权限:

@RequiresApi(api = Build.VERSION_CODES.Q)
    private static final String[] BACKGROUND_LOCATION_PERMISSIONS = {
            Manifest.permission.ACCESS_BACKGROUND_LOCATION,
    };    
Run Code Online (Sandbox Code Playgroud)

只能按这个顺序!

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);
Run Code Online (Sandbox Code Playgroud)

如果我首先尝试请求后台许可 - 它不会起作用。

如果我只请求后台权限(没有已经授予前台权限) - 它不会工作。

我应该请求前台权限 - 然后我应该请求后台权限 - 一一。

Paw*_*wel 10

在 Android 11 上,如果用户未首先授予前台位置权限,则后台位置权限请求将被隐式拒绝。

同时包含前台和后台位置权限的请求将被视为无效:

如果您的应用面向 Android 11(API 级别 30)或更高版本,系统会强制执行此最佳实践。如果您同时请求前台位置权限和后台位置权限,系统会忽略该请求,并且不会授予您的应用任何权限。

请参阅运行时请求位置访问


Rus*_*hts 0

解决办法是:

第 1 步:应用程序应请求前台位置权限:

private static final String[] FOREGROUND_LOCATION_PERMISSIONS = {
            Manifest.permission.ACCESS_FINE_LOCATION,       // GPS
            Manifest.permission.ACCESS_COARSE_LOCATION,     // GPS approximate location
    };
Run Code Online (Sandbox Code Playgroud)

第 2 步:应用程序应请求后台位置权限:

@RequiresApi(api = Build.VERSION_CODES.Q)
    private static final String[] BACKGROUND_LOCATION_PERMISSIONS = {
            Manifest.permission.ACCESS_BACKGROUND_LOCATION,
    };    
Run Code Online (Sandbox Code Playgroud)

只能按照这个顺序!

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);
Run Code Online (Sandbox Code Playgroud)

如果我首先尝试请求后台权限 - 它不会起作用。

如果我仅请求后台权限(没有已授予的前台权限)-它将无法工作。

我应该请求前台权限 - 然后我应该请求后台权限 - 一项一项。

ps 我提供了更清楚的信息 - 在我看来,除了正确的 Pawel 答案之外,还用代码示例来回答,