HMS FusedLocationProvider и HuaweiMap не работают - PullRequest
1 голос
/ 25 мая 2020

Я использовал этот класс, чтобы получить текущее местоположение устройства для моего приложения карты. Я использую это с 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))
        }
    }

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Возможная причина следующая:

После выполнения кода checkLocationSettings во время выполнения кода check.getResultThrowException было обнаружено исключение. Однако код обнаруженной ошибки не 6 (RESOULTION_REQUIRED).

Следовательно, код com.huawei.hms.location.LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE был непосредственно выполнен для отчета Location is not available после выполнения кода com.huawei.hms.location.LocationSettingsStatusCodes.RESOLUTION_REQUIRED-> if(!locationResolutionAsked).

В результате не было получено ни исключения, ни результата локации. Рекомендуется добавить строку кода в when (e.statusCode) для записи журналов ошибок, а затем продолжить анализ ошибок.

0 голосов
/ 22 июня 2020

Используйте OnSuccessListener вместо OnCompleteListener

   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

...