目录

FAQ

如果您在下面没有找到需要的问题,请加入Stack Overflow社区参与讨论。

Android SDK

[h2]在手机或华为平板上集成Location SDK,接口调用成功,为什么无法获取到位置信息?

  1. 请确保已经安装了“HMS Core”,且为3.0.0.300及以上版本。
  2. 检查“HMS Core”应用定位权限是否打开。打开“设置 > 应用 > 应用管理”找到“HMS Core”应用(不同版本的系统可能有差异,如果没找到“HMS Core”,请点击“应用管理”界面右上角的菜单图标,再点击“显示系统进程”,查找“HMS Core”或者华为移动服务)。点击“HMS Core”或者华为移动服务图标,然后在“应用信息”界面打开“权限 > 位置信息”中查看位置权限开启状态,确保“HMS Core”应用定位权限处于开启状态。如果是在EMUI 10.0或更高版本的设备上,“HMS Core”的定位权限需要是“始终允许”。
  3. 确保待测试应用的定位权限处于开启状态。
  4. 确保下拉通知栏中的“位置信息”开关处于开启状态。
  5. 部分地区GNSS或网络信号较弱,可能导致无法获取位置信息。
  6. 建议设备插卡使用,以便定位服务可以为您提供更精确的位置信息。

[h2]非华为Android手机集成Location SDK 6.0.0及以上版本时,调用不支持的特性时有什么现象?

报NOT_YET_SUPPORTED错误码,在部分手机上可能会出现如下错误日志,但不影响正常功能,请您放心使用。

b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: FATAL EXCEPTION: Location_Location_DispatchTaskManager_14'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: Process: com.huawei.locationsample6, PID: 30443'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: com.huawei.location.router.dispatch.DispatchException: api interface not register'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat com.huawei.location.router.dispatch.DispatchThreadPoolExecutor.processRequest(Unknown Source:90)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat com.huawei.location.router.dispatch.DispatchThreadPoolExecutor.beforeExecute(Unknown Source:10)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1164)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.lang.Thread.run(Thread.java:923)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: FATAL EXCEPTION: Location_Location_DispatchTaskManager_14'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: Process: com.huawei.locationsample6, PID: 30443'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: com.huawei.location.router.dispatch.DispatchException: api interface not register'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat com.huawei.location.router.dispatch.DispatchThreadPoolExecutor.processRequest(Unknown Source:90)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat com.huawei.location.router.dispatch.DispatchThreadPoolExecutor.beforeExecute(Unknown Source:10)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1164)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)'
b'08-09 21:23:47.202 30443 18338 E AndroidRuntime: \tat java.lang.Thread.run(Thread.java:923)'

[h2]非华为Android手机集成Location SDK 时,接口调用成功,获取的位置信息为什么没有城市等具体地址信息?

Location SDK不支持非华为Android手机返回当前位置的城市、所属区县、街道等具体地址信息。

[h2]在Android 11上,已安装HMS Core(APK)最新版本,仍然提示升级,如何解决?

Android 11更改了应用查询用户在设备上已安装的其他应用以及与之交互的方式。您应用的targetSdkVersion是30或者更高版本,并且集成的Location Kit 6.2.0.300之前版本时,将无法访问HMS Core(APK),并且持续提示升级。

您可以通过以下两种方法解决。

[h2]定位接口传入PRIORITY_NO_POWER时,为什么无法获取到位置信息?

因为PRIORITY_NO_POWER属于被动定位,主要监听原生定位的位置,如果获取不到位置信息,可能没有应用发起原生定位请求,导致没有获取到位置信息。

[h2]通过Location Kit获取用户位置时,为什么返回错误码:-5?

可能未配置混淆文件导致HMS Core SDK混淆,返回错误码-5,请在编译APK前配置混淆脚本。

[h2]检查设备定位设置无误,使用getLastLocation接口,为什么无法获取到位置信息?

getLastLocation接口是从系统缓存中获取位置信息的,该接口不保证一定可以获取到位置信息。如果获取的位置信息为null,则可能是系统缓存已经被清除;此时先调用requestLocationUpdates接口获取位置信息以刷新缓存,再调用getLastLocation,即可以获取到位置信息。

[h2]mock模式对正常定位的影响,如何判断当前位置是否为mock位置?

通过setMockMode(boolean isMockMode)将位置模拟模式设置为true后,定位服务将不再使用GNSS或网络位置,最终返回通过setMockLocation(Location mockLocation)设置的位置信息。需要注意的是,一旦设置为位置模拟模式,将影响该设备上所有使用定位服务的应用的定位功能。因此,当您不再需要进行位置模拟时,请通过setMockMode(boolean isMockMode)将位置模拟模式设置为false。

可以通过mockLocation.getExtras().getBoolean("mockLocation")的返回值来判断当前位置是否为mock位置,返回true则当前位置为mock位置,返回false则为真实位置。

[h2]如何根据接口返回值进行问题定位?

当调用定位服务的接口失败时,可以通过返回值初步判断问题原因。获得接口返回的Task对象,调用addOnFailureListener(),并重写onFailure(Exception e)方法,打印异常信息e.getMessage,异常信息中包含异常错误码和异常描述。具体的错误码含义请参见通用错误码。

[h2]如何日志抓取?

调用定位服务接口无法获取位置信息,且根据上述步骤难以定位原因。可以抓取运行日志并选择“支持 > 技术支持 > 在线提单”提交问题,华为支持人员会及时处理。

日志抓取办法如下:

  1. adb连接手机,执行如下命令。

    adb logcat –v time > D:\hwlocation.log

  2. 复现问题场景。
  3. 按快捷键“Ctrl+C”完成。

同时请您尽可能记录出现问题的设备型号、EMUI版本号、HMS Core版本号、集成的SDK版本号以及复现问题的步骤,以便技术人员可以更快地为您进行技术定位。

[h2]定位服务支持最小的SDK版本和系统版本?

minSdkVersion

最低Android版本

最低EMUI版本

19

5.1

5.0

[h2]第三方App获取位置信息时,出现HMS Core(APK)的定位权限申请界面?

定位过程中,由于第三方应用触发了HMS Core(APK)的定位服务能力,为了保障第三方应用的定位功能正常运行,需要用户授权HMS Core(APK)位置权限,此权限的授予与第三方应用权限授予无关。如使用Android Q版本终端,需要授予HMS Core后台获取位置权限(授权弹框中的始终允许)。

[h2]为什么mock模式无法使用?

setMockMode(boolean isMockMode)仅支持华为手机EMUI 5.0及以上版本。

[h2]海外没有GMS的华为手机,如何打开网络位置服务开关?

打开“设置 > 定位服务 > 位置信息服务 > 网络位置服务 > 开启网络位置服务”。

[h2]海外没有GMS的华为手机关闭网络定位时,导航卫星定位是否可用?

没有网络或者手机关闭网络定位时,不影响导航卫星定位功能的使用。

[h2]HMS Core(APK)定位权限选择“仅使用期间允许”,定位功能不可用?

HMS Core(APK)是后台服务,需要得到用户“始终允许”的定位权限,才能够正常使用定位功能。

[h2]应用权限选择为“仅使用期间允许”时,应用在后台发起定位请求接口返回10803: PERMISSION_DENIED?

应用权限建议选择“始终允许”,才能保证应用在进行后台定位请求时,持续返回正确的数据。

[h2]为什么室内定位时间比较长?

用户在室内时,在正常情况下,导航卫星不能够有效覆盖,HMS Core会选择网络定位方式,定位速度相比于卫星定位慢。

[h2]如果只想获取一次位置,使用requestLocationUpdates还是使用getLastLocation比较好?

如果对位置的实时性要求较高,推荐使用requestLocationUpdates接口。如果只想收到一次位置信息,可以将LocationRequest接口中setNumUpdates方法参数numUpdates设置为1。

[h2]调用地理围栏接口时,返回错误码10206:GEOFENCE_SERVICE_SWITCH_OFF,如何打开地理围栏服务开关?

打开“设置 > 隐私 > 定位服务 > 系统服务 > 地理围栏服务”,开启地理围栏服务。

[h2]如依赖Location SDK 6.12.0.300版本后出现异常:IllegaArgumentException,Unsupported class file major version 59?

在gradle.properties文件中添加android.jetifier.blacklist=bcprov-jdk15on。

iOS Location SDK

[h2]iOS定位如何区分定位类型?

iOS Location SDK提供的是融合定位。一般地,iOS Location SDK会先按照最快的“无网定位”(即离线网络定位)返回一个位置,当有网络连接时,在用“有网定位”(即在线网络定位)更新位置。

网络定位本身又包含基站定位和WIFI定位两种方式,当WIFI模块开启(开启即可,可不连接)时会运用WIFI定位,反之采用基站定位。

在室外环境时,设备会利用A-GPS上网查询卫星星历,在能收到GPS信号的情况下,使用GPS连接卫星(A-GPS用于遍历星历提速)定位。

根据当前信号情况和网络环境,iOS设备可能在上述方式之间反复迭代,没有绝对的步骤和方式,而且随着iOS升级,定位规则可能改变。所以iOS定位结果是无法具体区分来自于GPS定位还是来自于网络定位。

[h2]iOS Location SDK 如何设置定位结果按照指定时间间隔和距离间隔返回?

iOS Location SDK定位不支持指定时间间隔和距离间隔,外部不可控,相关说明如下:

iOS Location SDK定位能力是基于苹果原生定位能力进行封装,故iOS Location SDK定位不支持指定时间间隔和距离间隔。

苹果原生定位能力提供了两种定位回调机制。

  1. 按照最小距离间隔回调:

    设置定位最小更新距离方法如下,单位米。当两次定位距离满足设置的最小更新距离时,iOS Location SDK会返回符合要求的定位结果。

    self.locationManager.distanceFilter = 200;

  2. 设备移动即回调:

    当 iOS 设备移动时即回调定位结果,不依照任何时间间隔和距离间隔,外部不可控。

[h2]iOS Location SDK是否支持热更新?

iOS Location SDK不支持热更新,以静态库形式集成。

[h2]为什么iOS Location SDK有时定位误差会很大?

iOS Location SDK初始定位都是用基站或者无网基站定位,误差在几百米至几公里之间不等。之后,如果无法搜索到WIFI或者卫星信号,就会一直是这个精度返回定位结果。您可以打开WIFI功能(不用连上,只需要打开即可),或者将设备放到开阔的地方以便收到卫星信号。

解决方法:等待一段时间,开启数据流量和设备WIFI模块(定位之后即可关闭),或者到户外进行测试。

[h2]定位返回的坐标,是用的哪个坐标系?

这个数据跟定位地点的地理位置相关,在中国大陆、香港特别行政区、澳门特别行政区返回GCJ02坐标;在中国台湾省返回的是WGS84坐标;海外地区,返回的也是WGS84坐标。

[h2]iOS Location SDK 如何解决iOS 11上定位权限问题?

iOS 11在定位权限设置上有更新,请您按以下方式进行设置:

在项目的 Info.plist 添加定位权限申请,根据您的业务需求,选择下列方式设置。

iOS 9 - iOS 10 版本:

“NSLocationWhenInUseUsageDescription” 表示应用在前台的时候可以搜到更新的位置信息。

“NSLocationAlwaysUsageDescription” 申请Always权限,以便应用在前台和后台(suspend 或 terminated)都可以获取到位置信息。

iOS 11版本:

“NSLocationWhenInUseUsageDescription”:表示应用在前台的时候可以获取到位置信息。

“NSLocationAlwaysAndWhenInUseUsageDescription” 申请Always权限,以便应用在前台和后台(suspend 或 terminated)都可以获取到位置信息。

如果您的应用需要支持iOS 9及上系统使用定位功能,建议在plist文件中同时添加“NSLocationWhenInUseUsageDescription”、“NSLocationAlwaysUsageDescription”和“NSLocationAlwaysAndWhenInUseUsageDescription”权限声明。

[h2]iOS Location SDK使用出现10803、10000错误,该怎么办?

使用iOS Location SDK能力时,要先授权再使用对应功能,避免边授权边使用的情况和迅速在设置中修改定位权限并切换到应用的情况。

[h2]朝向和朝向精度为-1,是什么问题?

朝向和朝向精度值为-1,该情况表示未能成功获取到精度,网络定位不返回朝向信息,请关闭WIFI和蜂窝网络,进行GPS定位,如果成功定位信息仍无法获取到有效的经纬度,检查设备陀螺仪功能。

[h2]连续定位中精度选择百米及以上,只回调几条信息后不再回调,是什么问题?

请耐心等待,该情况大概率出于正常情况,仍在继续回调中,回调时间间隔较长。发生与精度对应的位置偏移,有助于快速收到回调。如果上述方法仍不能解决您的问题,请提工单联系我们。

[h2]如何解决使用后台定位被AppStore拒绝的问题?

  1. 使用到“后台定位”功能,必须在工程的 Info.plist中添加:Privacy - Location Always Usage Description字段,内容可以根据实际应用场景填写,如:

  2. 必须开启Capabilities下的Background Modes下的Location updates:

  3. 如果应用使用“后台定位”功能的业务场景很容易被苹果审核人员找到,并且理由比较合理,一般就能审核通过。如果业务场景比较深,或者理由比较不充分,审核人员在使用App期间没体验到“后台定位”功能,而恰巧又开启了步骤2,那么需要在审核的时候,在“APP审核信息备注”如实写一下理由,或者告诉审核人员如何触发“后台定位”,大多数情况都能审核通过。

[h2]手机没信号可以定位吗?

情况1:【没有手机信号,没有WIFI信号,没有上网】定位只能在户外利用GPS进行,初次定位时间可能很长,需要数分钟之久,之后定位正常。

情况2:【没有手机信号, 有WIFI信号,没有上网】如果之前在周围上过网,下载了附近的热点,则利用无网WIFI定位可以找到位置,否则,和情况1一样。

情况3:【没有手机信号, 有WIFI信号,可以上网】利用WIFI定位找到位置,并且在定位时还会下载大量的周围很大一个区域的所有WIFI热点信息,用于今后无网WIFI定位。

情况4:【有手机信号, 没有WIFI信号,没有上网】如果能收到iOS内置的“重要基站”的信号,则使用这些基站进行无网基站定位,否则,无法定位。

情况5:【有手机信号, 没有WIFI信号,可以上网】使用基站定位联网查询进行定位,同时可能会更新本地“重要基站”信息。

[h2]模拟器上为什么获取不到位置信息和朝向信息?

模拟器获取不到朝向信息,但可以获取到模拟的位置信息,请选中模拟器 > Features > Location选择任意非None项即可。

REST API

[h2]使用火狐浏览器导出围栏及下载模板却无文件生成,如何解决?

更改火狐浏览器设置,步骤如下:打开火狐浏览器,地址栏输入 “about:config”,回车;进入配置界面,搜索 “security.csp.enable”,将其设置为false,再重启浏览器。

[h2]网络定位(Web API)接口(networklocation/v1/geoLocation)返回403或405,如何处理?

可以在API管理中,尝试关闭Location Kit的开关,然后重新打开,稍等之后进行重试。具体操作:选中“API管理”,找到“Location Kit”,打开开关按钮。