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 时出错