正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用
Posted
技术标签:
【中文标题】正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用【英文标题】:Location updates not working indoors as claimed by Fusion Location Provider APIs 【发布时间】:2013-05-24 00:03:27 【问题描述】:问题:
如 Fusion Location Provider API 所述,位置更新无法在室内工作。
发生了什么:
-
我尝试在我的 android 应用中使用
LocationClient
实现最新的位置 API 来获取位置更新。
我在户外测试时,我的 Android 应用运行良好,没有任何问题。
但在室内(任何建筑物内)进行测试时,不会发生位置更新。
预期行为:
根据新的 API,当我在室内时,我希望得到建筑物周围的一些估计位置(因为 GPS 找不到准确位置的卫星信号)。
我发现最新的 Google 地图 Android 应用在估计位置的室内运行良好。
问题:
使用新的位置 API 来获取室内位置更新我还需要注意什么(不需要准确的位置,低精度也可以)。
我正在使用 Android 4.2.2 版本的 API 实现 Android 应用。我正在测试 HTC One X (OS v 4.1.1)
以下是我使用新 API 获取位置更新的 android 代码:
第一步:
mLocationClient = new LocationClient(this, this, this);
第二步:
// Create the LocationRequest object
mLocationRequest = LocationRequest.create();
// Use high accuracy
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
mLocationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
Step3:在onStart()
方法内 - 添加以下行:
// Connect the client.
mLocationClient.connect();
Step4:在onConnected()
方法内 - 添加下面的行:
mLocationClient.requestLocationUpdates(mLocationRequest, this);
Step5:在onLocationChanged()
方法内部——监听位置更新。测试内部时不调用此方法。只有在找到 GPS 信号时才会调用此方法。
double lat = location.getLatitude();
double lng = location.getLongitude();
最后在 Android Manifest 中添加了以下权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
【问题讨论】:
【参考方案1】:根据您的 sn-ps,您的代码在我看来可以接收室内位置。
尝试在您的应用请求位置并且您在室内时进行转储(期望接收位置但没有): adb shell dumpsys 活动服务 com.google.android.location.internal.GoogleLocationManagerService
你可以在这里发布输出吗?
您能否再次检查设置->WiFi 是否已启用,以及设置->位置访问->Wi-Fi 和移动网络位置是否已启用(室内定位都需要)。
您的手机有 SIM 卡吗?当 wifi 不可用时,这将允许手机信号塔派生位置。
最后,您说 Google 地图会在同一建筑物内为您提供室内位置。精确圆的大致大小是多少(即接近 20 米还是 100 米)?
【讨论】:
感谢您的快速回复。我仔细检查过,WiFi 已启用;在位置访问下,启用了 Wi-Fi 和移动网络位置; sim卡也可以用。在谷歌地图中,在同一建筑物内进行测试时,位置精度显示为“1300 米”。但没有在我的应用程序中获取位置。我很快就会在运行我的应用程序时得到转储,并会更新你。 根据您在 Google 地图中获得的准确度,您正在接收室内手机位置,这意味着您的建筑物中没有 wifi 位置。我猜有一个错误,单元位置由于某种原因无法正常工作。您可以尝试在有 wifi 位置的地方(可能在商场)。不知道是什么原因造成的,但它可能会在未来的版本中得到修复。 顺便说一下,如果您确实发布了转储,您可能需要删除 lat/lng 位置以保护隐私 - 由您决定。 在建筑物内测试 Google Maps android 应用程序时的另一个观察结果:1) 我搬到最近的 WiFi 路由器并开始测试,然后我的位置精确到 60 米。 2)我关闭了WiFi,那么精度是1600米。但是当我使用我的应用程序尝试相同的测试用例时,我没有在建筑物内获得任何位置更新。【参考方案2】:叮咚!我的 Galaxy Nexus 和 Fusion Location Provider API 也有同样的问题。
我的决定是将 LocationRequest
对象的优先级设置为 LocationRequest.PRIORITY_LOW_POWER
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationClient = new LocationClient(this, this, this);
对我来说,它在室内(低精度)和室外(高精度)都可以正常工作。 希望对你有帮助。
【讨论】:
【参考方案3】:您确定您没有断开客户端连接吗?一旦断开 LocationClient,当前位置更新请求就会消失。
代码 sn-ps 本身不是一个完整的应用程序。但是,示例应用程序是一个完整的工作应用程序。 sn-ps 的目的是向您展示关键步骤,您可以从中进行剪切和粘贴。示例应用提供了更多材料。
【讨论】:
感谢您的回复。我使用 Toast 仔细检查了客户端并已连接。我得到了示例应用程序并安装到我的手机上。即使在建筑物内使用示例应用程序进行测试时,我也无法获得位置(与我的应用程序中的行为相同)。但在谷歌地图中,同时在同一建筑物内进行测试时,位置精度显示为“1300 米”。您是否认为 Google Maps Android 应用程序代码可能会做一些额外的检查,而这些检查并未在开源 API 中讨论。 所以您是说示例应用程序在建筑物外工作但不在建筑物内,没有其他变化。 是的,没有进行任何更改,我按原样部署了示例应用程序。它在建筑物外面工作正常,但在里面却不行。 如果默认情况下未在应用程序中启用定位服务,并且如果我使用定位意图启用任何一项定位服务,则客户端不会在 onActivityResult 方法中重新连接并且无法获取当前位置。如何解决此问题问题?【参考方案4】:在对 HTC One X (4.1.1) 进行长时间的测试和调试后,我决定在任何其他手机型号上尝试相同的测试用例。幸运的是,在使用我朋友的三星 S3 (4.1.1) 进行测试时,我的应用程序也可以在室内运行。在同一时间和地点,当我用我的 HTC One X 进行测试时,我没有在室内获得位置。两部手机都设置了相同的设置(WiFi/GPS/移动网络全部启用)。
为了确认这是特定设备的问题,我使用我的应用程序在建筑物内的不同角落进行了多次测试,我在 HTC 上的所有室内位置都看到了相同的问题(但在相同的位置 S3 获取室内位置) .
【讨论】:
启用 PRIORITY_HIGH_ACCURACY 后,您是否注意到手机上的 GPS 图标亮起? (意味着 GPS 无线电正在积极寻找卫星)?以上是关于正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用的主要内容,如果未能解决你的问题,请参考以下文章
INSTALL_FAILED_CONFLICTING_PROVIDER
ANDROID Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER
android——Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER 解决方案
动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o
使用Vue自定义组件时,报did you register the component correctly? For recursive components, make sure to provid