Я использовал этот класс, чтобы получить текущее местоположение устройства для моего приложения карты. Я использую это с GooglePlayServices
, и он работает нормально, но недавно я переключился на HMS
для устройств Huawei, если GooglePlayServices
недоступен на устройстве. Я заменил все классы GooglePlayServices
зеркальными объектами из HMS
импортированной библиотеки, и она скомпилировалась без ошибок. Но когда я позвоню в текущее местоположение, он ничего не вернет. Без исключения, без успеха или неудачи.
Я не получил обратный вызов для блока onLocationResult()
или catch()
. Согласно отладчику, последняя вызываемая строка: val task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper())
У кого-нибудь есть эта проблема? Это явно новая проблема. Тестирование на Huawei P40
, где GooglePlayServices
доступны не .
Также HuaweiMap не работает в режиме выпуска. getMapAsync()
не вернет onMapReady()
обратный вызов. Он там застрял. Но если я переключу режим отладки, он работает правильно.
UDPATE: HuaweiMap сейчас работает. Обновленный прогард. Но Location все еще не работает. Он не работает даже в режиме отладки.
Код:
private inner class LocationCbHua(val lp: com.huawei.hms.location.FusedLocationProviderClient,
val onFailure: (()->Unit)? = null,
val onSuccess: (GpsLocation)->Unit)
: com.huawei.hms.location.LocationCallback() {
init {
val lr = com.huawei.hms.location.LocationRequest.create().apply {
priority = com.huawei.hms.location.LocationRequest.PRIORITY_HIGH_ACCURACY
interval = 200
}
val lsr = com.huawei.hms.location.LocationSettingsRequest.Builder().run {
// setAlwaysShow(true) // TEST
addLocationRequest(lr)
build()
}
val check = com.huawei.hms.location.LocationServices.getSettingsClient(activity!!).checkLocationSettings(lsr)
check.addOnCompleteListener {
try {
check.getResultThrowException(com.huawei.hms.common.ApiException::class.java)
val task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper())
task.addOnFailureListener {
onFailure?.invoke()
}
} catch (e: com.huawei.hms.common.ApiException) {
when (e.statusCode) {
com.huawei.hms.location.LocationSettingsStatusCodes.RESOLUTION_REQUIRED-> if(!locationResolutionAsked){
// Location settings are not satisfied. But could be fixed by showing the user a dialog.
try {
// Cast to a resolvable exception.
val re = e as com.huawei.hms.common.ResolvableApiException
// Show the dialog by calling startResolutionForResult(), and check the result in onActivityResult().
re.startResolutionForResult(mainActivity, MainActivity.REQUEST_LOCATION_SETTINGS)
locationResolutionAsked = true
} catch (e: Exception) {
e.printStackTrace()
}
}
com.huawei.hms.location.LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE->{
// Location settings are not satisfied. However, we have no way to fix the settings so we won't show the dialog.
App.warn("Location is not available")
onFailure?.invoke()
}
}
}
}
}
fun cancel(){
lp.removeLocationUpdates(this)
currLocCb = null
}
override fun onLocationResult(lr: com.huawei.hms.location.LocationResult) {
cancel()
val ll = lr.lastLocation
onSuccess(GpsLocation(ll.longitude, ll.latitude))
}
}