位置管理器删除更新权限

Mad*_*bar 8 android android-location

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

 if(locationManager != null){
            locationManager.removeUpdates(GPSListener.this);
        }
Run Code Online (Sandbox Code Playgroud)

停止gps更新GPS Listener是一个实现LocationListener的类.

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

调用需要用户可能拒绝的权限:代码应明确检查权限是否可用(带 checkPermission)或处理潜力SecurityException

我没有得到上面代码中的问题.需要在清单文件中添加任何额外的权限吗?

问候.

Tim*_*Tim 26

从SDK 23开始,您应该/需要在调用Location 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

checkSelfPermission(),这是检查'你'(这个应用程序)是否具有正确的权限.还有checkPermission(),它是检查另一个进程是否具有正确的权限.

笔记

  • 在执行此运行时检查之后,还需要在AndroidManifest中要求相关权限.
  • 如果你的targetSdk <23,你应该使用ContextCompat.checkSelfPermission()(感谢JerryBrady)

  • 请注意,如果目标是<23,则应使用ContextCompat.checkSelfPermission(). (8认同)

Rod*_*rba 14

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

例:

try {
    locationManager.removeUpdates(GPSListener.this);
} catch (SecurityException e) {
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED");
}
Run Code Online (Sandbox Code Playgroud)

  • 问题是"compileSdkVersion 23",这并不意味着该应用程序的目标是23.如果您想要向后兼容完整的Android M支持,请使用ContextCompat.checkSelfPermission()代替它,它将起作用. (2认同)

小智 5

要添加到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)
Run Code Online (Sandbox Code Playgroud)