位置管理器删除更新权限

Location Manager remove updates permission

我正在使用 android studio 并且 compileSdkVersion 是 23 因为我正在使用下面的代码

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

停止 GPS 更新,其中 GPS 侦听器是 class,它实现了 LocationListener。

但是在 removeUpdates 行中我收到了 lint 警告

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or handle a potential SecurityException

我不明白上面代码中的问题是什么。 需要在清单文件中添加任何额外的权限吗?

此致。

从 SDK 23 开始,您 should/need 在调用位置 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(),就是检查'you'(这个app)是否有正确的权限。还有checkPermission(),就是检查另一个进程是否有正确的权限。

注释

  • 除了做这个运行时检查,还需要在AndroidManifest中要求相关权限。
  • 如果你的 targetSdk < 23,你应该使用 ContextCompat.checkSelfPermission() 代替(感谢 JerryBrady)

我无法使用 checkSelfPermission(),因为我的最小 API 是 14,而 23 是必需的。知道了,你也可以trycatch一个SecurityException.

示例:

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

要添加到 Jerry Brady 关于 ContextCompat 的评论中,这是 < 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)

这是我的解决方案!

  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);

            }