位置管理器删除更新权限

8

我正在使用 Android Studio,并且 compileSdkVersion 是 23。 我正在使用以下代码:

 if(locationManager != null){
            locationManager.removeUpdates(GPSListener.this);
        }

停止GPS更新,其中GPS监听器是一个实现了LocationListener的类。

但是在removeUpdates行中,我收到了下面的lint警告:

调用需要用户拒绝的权限:代码应该显式检查权限是否可用(使用 checkPermission)或处理潜在的 SecurityException

我不知道以上代码中的问题在哪里。 需要在清单文件中添加额外的权限吗?

谢谢。


1
https://developer.android.com/preview/features/runtime-permissions.html - Kuffs
4个回答

26

自SDK 23以来,您应该/需要在调用位置API功能之前检查权限。以下是如何执行此操作的示例:

if (locationManager != null) {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        locationManager.removeUpdates(GPSListener.this);
    }
}

checkSelfPermission(),它用于检查“您”(此应用程序)是否具有正确的权限。还有checkPermission(),它用于检查另一个进程是否具有正确的权限。

注释

  • 除了运行时检查外,仍然需要在AndroidManifest中要求相关权限。
  • 如果您的targetSdk为< 23,则应改用ContextCompat.checkSelfPermission()(感谢JerryBrady)

8
请注意,如果您的目标 API 版本小于 23,则应改用 ContextCompat.checkSelfPermission() 方法。 - Jerry Brady
我想哭。为什么应用程序需要权限从位置管理器中删除已经附加的位置监听器? - Glenn Bech

14

因为我的最低API版本是14,而checkSelfPermission()需要23及以上的版本,所以我无法使用它。在这种情况下,您可以尝试使用trycatch来捕获SecurityException异常。

示例:

try {
    locationManager.removeUpdates(GPSListener.this);
} catch (SecurityException e) {
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED");
}

问题是针对目标 SDK 版本 23 的。与最小 API 没有关系。 - Madhukar Hebbar
2
问题是针对“compileSdkVersion 23”,这并不意味着应用程序的目标是23。如果您想要向后兼容并获得完整的Android M支持,请改用ContextCompat.checkSelfPermission(),它会起作用。 - Jerry Brady
1
对不起,我没有意识到。但是我认为使用 try-catch 这个选项仍然很有用。 - Rodrigo Borba
1
这个答案对我有所帮助。但我认为这不是一个适当的解决方案。但我已经点赞了它。 - Sai's Stack

5

关于ContextCompat,Jerry Brady的评论已经提到了一些内容,以下是完整的代码(适用于小于23的版本):

 if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)

-1

这是我的解决方案!

  if (Build.VERSION.SDK_INT >= 23) {

                if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

                    lm.removeUpdates(this);
                }
            }
            else
            {
                lm.removeUpdates(this);

            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接