web-dev-qa-db-ja.com

HMS FusedLocationProviderおよびHuaweiMapが機能しない

このクラスを使用して、マップアプリのデバイスの現在位置を取得しました。私はこれをGooglePlayServicesと一緒に使用していて、正常に動作していますが、HMSがデバイスで使用できない場合、HuaweiデバイスをGooglePlayServicesに最近切り替えました。すべてのGooglePlayServicesクラスをHMSインポートされたlibのミラーオブジェクトに置き換え、エラーなしでコンパイルしました。しかし、現在の場所を要求すると、何も返されません。例外もなく、成功も失敗もありません。

onLocationResult()またはcatch()ブロックへのコールバックを受け取りませんでした。デバッガーによると、呼び出される最後の行はval task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper())です

誰かがこの問題を抱えていますか?これは明らかに新しい問題です。これを_Huawei P40_でテストすると、GooglePlayServicesnotを使用できます。

また、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))
        }
    }
_
2
martin1337

考えられる原因は次のとおりです。

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)に追加し、エラー分析を続行することをお勧めします。

1
shirley

OnCompleteListenerの代わりにOnSuccessListenerを使用します

   val check = com.huawei.hms.location.LocationServices.getSettingsClient(activity!!).checkLocationSettings(lsr)
   check.addOnSuccessListener{
       lp.requestLocationUpdates(lr, this, Looper.getMainLooper())
   }

この投稿をチェックすることもできます:

https://forums.developer.huawei.com/forumPortal/en/topicview?tid=0201272177441270079&fid=0101187876626530001

0
danms07