java.lang.SecurityException:“被动”位置提供程序需要API级别26的ACCESS_FINE_LOCATION权限

问题描述 投票:0回答:2

我有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权限。然后为什么应用程序崩溃了?

java android android-permissions android-location android-api-levels
2个回答
0
投票

根据我的理解,您只是在检查是否授予许可。

如果您的应用/代码未在未授予权限的情况下结束,请务必通过调用...来请求权限

ActivityCompat.requestPermissions(this, permissionsStringArray,requestCodeInt);

并且在检查自我权限时尝试使用ContextCompat而不是ActivityCompat


0
投票

解:

而不是这一行:

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

© www.soinside.com 2019 - 2024. All rights reserved.