HMS FusedLocationProvider 和 HuaweiMap 不工作

Posted

技术标签:

【中文标题】HMS FusedLocationProvider 和 HuaweiMap 不工作【英文标题】:HMS FusedLocationProvider and HuaweiMap is not working 【发布时间】:2020-09-12 06:17:54 【问题描述】:

我使用这个类为我的地图应用程序获取设备的当前位置。我将它与GooglePlayServices 一起使用,它工作正常,但如果GooglePlayServices 在设备上不可用,我最近切换到华为设备的HMS。我用来自HMS 导入库的镜像对象替换了所有GooglePlayServices 类,并且它编译没有错误。但是当我要求当前位置时,它不会返回任何东西。没有例外,没有成功或失败。

我没有收到对onLocationResult()catch() 块的回调。 根据调试器调用的最后一行是val task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper())

有人有这个问题吗?这显然是一个新问题。在Huawei P40 上测试此功能,其中GooglePlayServices可用。

HuaweiMap 也不能在发布模式下工作。 getMapAsync() 不会返回 onMapReady() 回调。它卡在那里。但是如果我切换调试模式,它就可以正常工作。

UDPATE: 华为地图正在运行。更新了proguard。但是位置仍然无法正常工作。即使在调试模式下也无法正常工作。

代码:

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))
        
    

【问题讨论】:

您好,您有机会查看华为 Codelabs GitHub 上的示例吗? 是的。它看起来和我的几乎一样。但核心功能是一样的。 1.您是否在开发者页面上设置了商店数据位置? 2. 您是否保存了应用的密钥指纹以供发布(调试也是可选的)? 我从用于签名 APK 的 .keystore 文件生成了 SHA256 哈希。并将其添加到 AppGallery。我知道第一部分是什么。我刚刚从我的项目中下载了agconnect-services.json 并将其放置到类似于firebase google json 的资源中。 你能确保你为这两个库 - 地图和位置声明了正确的 proguard 规则吗? developer.huawei.com/consumer/en/doc/development/HMS-Guides/…(最后一点 5)和developer.huawei.com/consumer/en/doc/development/HMS-Guides/…(最后一点 3)。 【参考方案1】:

可能的原因如下:

执行 checkLocationSettings 代码后,在执行代码 check.getResultThrowException 期间捕获了异常。但是,捕获的错误代码不是6 (RESOULTION_REQUIRED)

因此,代码com.huawei.hms.location.LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE在执行完代码com.huawei.hms.location.LocationSettingsStatusCodes.RESOLUTION_REQUIRED-> if(!locationResolutionAsked)后,直接执行代码Location is not available

结果,既没有得到异常,也没有得到定位结果。建议您在when (e.statusCode)添加一行代码记录错误日志,然后继续进行错误分析。

【讨论】:

Catch 分支从未执行。我把日志放在when() 上面。最后一行是val task = lp.requestLocationUpdates(lr, this, Looper.getMainLooper()) 可以用addOnSuccessListener和addOnFailureListener代替addOnCompleteListener,请重试,我看源码,addOnCompleteListener会直接抛出异常【参考方案2】:

使用 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

【讨论】:

以上是关于HMS FusedLocationProvider 和 HuaweiMap 不工作的主要内容,如果未能解决你的问题,请参考以下文章

FusedLocationProvider 始终返回 null Location 对象

FusedLocationProvider 有时会给出错误的位置

FusedLocationProvider 位置更新的单独类或服务?

无法使用 FusedLocationProvider 将 Gps 设置升级到高精度在某些设备中

Android:FusedLocationProvider,每隔几秒获取一次位置

使用 fusedLocationProvider.removeLocationUpdates (locationCallback) Android Studio 时出错