【发布时间】:2019-02-12 11:03:30
【问题描述】:
我有 android 应用程序,我们最近从 API 级别 22 转移到了 API 级别 26。
我已检查该应用是否具有 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限之一。
我发现但无法解决的一个问题是它给出了一个异常,例如 “java.lang.SecurityException:“被动”位置提供程序需要 ACCESS_FINE_LOCATION 权限”
我的 Android 清单文件有:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
我也遇到了这种异常:
Process: edu.syr.ischool.orange.indoormap3, PID: 12666
java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission.
at android.os.Parcel.readException(Parcel.java:2005)
at android.os.Parcel.readException(Parcel.java:1951)
at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:802)
at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1220)
at utils.CheckinUtils.checkLocation(CheckinUtils.java:100)
at utils.CheckinUtils.resume(CheckinUtils.java:247)
也是我的 checkinUtil --> checkLocation 方法
if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
locationManager = (LocationManager) activity.getSystemService(serviceString);
Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
我已经检查了其中任何一个的许可,如 https://developer.android.com/reference/android/location/LocationManager#getLastKnownLocation(java.lang.String) 所记录的那样
仍然,它为 ACCESS_FINE_LOCATION 提供了一个异常,但由于它通过了 if 条件并提供了安全异常,因此它应该具有 ACCESS_COARSE_LOCATION 权限。那么为什么应用会崩溃呢?
【问题讨论】:
-
应用程序在上述日志中崩溃?
-
可以使用运行时权限吗
-
@UmangBurman ,是的,应用程序在上述日志中崩溃。还有 Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);这一行是 CheckinUtils.java:100
-
Nilesh,请查看答案一次。并尝试
-
您的 if 表达式不正确,因为它目前需要拒绝 both 权限才能发生
return。
标签: java android android-permissions android-location android-api-levels