【发布时间】: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)。
标签: android android-location huawei-mobile-services huawei-location-kit