このクラスを使用して、マップアプリのデバイスの現在位置を取得しました。私はこれをGooglePlayServices
と一緒に使用していて、正常に動作していますが、HMS
がデバイスで使用できない場合、HuaweiデバイスをGooglePlayServices
に最近切り替えました。すべてのGooglePlayServices
クラスをHMS
インポートされたlibのミラーオブジェクトに置き換え、エラーなしでコンパイルしました。しかし、現在の場所を要求すると、何も返されません。例外もなく、成功も失敗もありません。
onLocationResult()
またはcatch()
ブロックへのコールバックを受け取りませんでした。デバッガーによると、呼び出される最後の行はval task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper())
です
誰かがこの問題を抱えていますか?これは明らかに新しい問題です。これを_Huawei P40
_でテストすると、GooglePlayServices
はnotを使用できます。
また、HuaweiMapはリリースモードでは動作しません。 getMapAsync()
はonMapReady()
コールバックを返しません。そこに行き詰まりました。しかし、デバッグモードを切り替えると、正しく動作します。
DPATE: HuaweiMapは現在動作しています。プロガードを更新。しかし、場所はまだ機能していません。デバッグモードでも機能しません。
コード:
_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))
}
}
_
考えられる原因は次のとおりです。
CheckLocationSettingsコードが実行された後、コード_check.getResultThrowException
_の実行中に例外がキャッチされました。ただし、キャッチされたエラーコードは6 (RESOULTION_REQUIRED)
ではありません。
したがって、コードcom.huawei.hms.location.LocationSettingsStatusCodes.RESOLUTION_REQUIRED-> if(!locationResolutionAsked)
が実行された後、コード_com.huawei.hms.location.LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE
_が直接実行され、_Location is not available
_が報告されました。
その結果、例外も場所の結果も取得されませんでした。エラーログを記録するコード行をwhen (e.statusCode)
に追加し、エラー分析を続行することをお勧めします。
OnCompleteListenerの代わりにOnSuccessListenerを使用します
val check = com.huawei.hms.location.LocationServices.getSettingsClient(activity!!).checkLocationSettings(lsr)
check.addOnSuccessListener{
lp.requestLocationUpdates(lr, this, Looper.getMainLooper())
}
この投稿をチェックすることもできます: