![](/img/trans.png)
[英]Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations in android 6
[英]Android location request PRIORITY_HIGH_ACCURACY has no effect
我的Android應用需要高精度的位置跟蹤。 在應用程序啟動時,它會以編程方式讀取位置設置,並在未選擇高精度時顯示屏幕。
我將Google的官方示例( https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient )改編為Kotlin。
這在華為手機上有效,但在三星S7和S8上失敗:如果用戶選擇了Power平衡 ,則會出現一個對話框,並且位置跟蹤設置為高精度 。 但是,如果之前僅選擇了GPS ,則不會拋出ApiException
,並且設置保持不變。
val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())
result.addOnCompleteListener(OnCompleteListener {
try {
it.getResult(ApiException::class.java)
// on Samsung + GPS only setting, execution passes here, no ApiException thrown
} catch(e: ApiException) {
if(e is ResolvableApiException) {
// ...show resolution dialog...
}
}
}
任何提示將非常感謝,謝謝:)
我遇到了同樣的問題。 我找到了解決方案。
val locationRequest = LocationRequest.create()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val result = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())
result.addOnCompleteListener(OnCompleteListener {
try {
it.getResult(ApiException::class.java)
// on Samsung + GPS only setting, execution passes here, no ApiException thrown
val locationManager = application.getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
AlertDialog.Builder(this@YourActivity)
.setMessage("message for user")
.setPositiveButton(R.string.ok) { _, _ ->
val intent = Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)
this@YourActivity.startActivityForResult(intent, RC_GPS_LOCATION)
}
.setNegativeButton(R.string.no_thanks, null)
.create()
.show()
} else {
// your code for High accuracy mode
}
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
ResolvableApiException resolvable = (ResolvableApiException) exception;
resolvable.startResolutionForResult(getActivity(), RC_RESOLVE_LOCATION);
} catch (IntentSender.SendIntentException ex) {
// Ignore the error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
showToast(R.string.sorry_your_device_is_not_supported);
break;
}
}
}
請不要忘記處理活動結果。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
RC_GPS_LOCATION -> {
// do action after user closed GPS settings screen
}
}
}
注意:在某些設備上,會啟動一個對話框,允許您一鍵啟用GPS。 在其他情況下,用戶將被重定向到設置屏幕(但這總比沒有好)。
我有同樣的問題與s8,所以我檢查設備,如果它是我用PRIORITY_BALANCED_POWER_ACCURACY
提出請求,它有效,但有一些延遲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.