簡體   English   中英

java.lang.SecurityException:“被動”位置提供者需要API級別26的ACCESS_FINE_LOCATION權限

[英]java.lang.SecurityException: “passive” location provider requires ACCESS_FINE_LOCATION permission on API level 26

我有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的許可。

因此,它應該不是Manifest.permission.ACCESS_FINE_LOCATION ,而不是android.Manifest.permission.ACCESS_FINE_LOCATION

Android清單文件應如下所示:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />

您可以在此處找到更多詳細信息請求用戶權限並使用Java代碼代替: Location lastKnow = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); 如下

  try {
    Location lastKnow1 = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
    Location lastKnow2 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    Location lastKnow3 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    if(lastKnow1 != null){
       --- your code ---
    } if(lastKnow2 != null){
       --- your code ---
    } if(lastKnow3 != null){
       --- your code ---
    } else {
       --- Toast ---
    }
  } catch (Exception e) {
            e.printStackTrace();
          }

通過使用以上代碼,您將永遠不會遇到異常問題。 **快樂編碼**

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM