我有Android应用程序,我们最近从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权限。然后为什么应用程序崩溃了?
根据我的理解,您只是在检查是否授予许可。
如果您的应用/代码未在未授予权限的情况下结束,请务必通过调用...来请求权限
ActivityCompat.requestPermissions(this, permissionsStringArray,requestCodeInt);
并且在检查自我权限时尝试使用ContextCompat
而不是ActivityCompat
解:
而不是这一行:
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) {
写这个:
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
您正在从Android获取内置权限,这可能是错误。
你必须获得你在那里提到的Manifest的许可。
因此,而不是android.Manifest.permission.ACCESS_FINE_LOCATION
,它应该只是Manifest.permission.ACCESS_FINE_LOCATION