![](/img/trans.png)
[英]Caused by: java.lang.SecurityException: “passive” location provider requires ACCESS_FINE_LOCATION permission
[英]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.