10

问题:

Fusion Location Provider API 声称,位置更新在室内不起作用。

发生了什么:

  1. LocationClient我尝试在我的 Android 应用程序中实现最新的位置 API 以获取位置更新。
  2. 我在户外测试时,我的 android 应用程序运行良好,没有任何问题。
  3. 但是在室内(任何建筑物内)进行测试时,不会发生位置更新。

预期行为:

根据新的 API,当我在室内时,我希望得到建筑物周围的一些估计位置(因为 GPS 找不到准确位置的卫星信号)。

我看到最新的 Google Maps android 应用程序在估计位置的室内运行良好。

问题:

使用新的位置 API 来在室内获取位置更新我还需要注意什么(不需要准确的位置,低精度也可以)。

我正在使用 Android 4.2.2 版本的 API 实现 Android 应用程序。我正在测试 HTC One X (OS v 4.1.1)

下面是我使用新 API 获取位置更新的 android 代码:

步骤1:

mLocationClient = new LocationClient(this, this, this);

第2步:

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

步骤3:内部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" />
4

4 回答 4

3

根据您的代码段,您的代码在我看来可以接收室内位置。

尝试在您的应用请求位置并且您在室内时进行转储(期望接收位置但不接收): adb shell dumpsys 活动服务 com.google.android.location.internal.GoogleLocationManagerService

你可以在这里发布输出吗?

您能否再次检查设置->WiFi 是否已启用,以及设置->位置访问->Wi-Fi 和移动网络位置是否已启用(室内定位都需要)。

你的手机有sim卡吗?当 wifi 不可用时,这将允许蜂窝塔派生位置。

最后你说谷歌地图在同一栋楼里给你一个室内位置。精确圆的大致尺寸是多少(即接近 20 米还是 100 米)?

于 2013-05-28T23:26:41.837 回答
1

叮当!我的 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);


对我来说,它在室内(低精度)和室外(高精度)都可以正常工作。希望它会帮助你。

于 2013-08-15T16:10:03.180 回答
0

在 HTC One X (4.1.1) 上进行长时间的测试和调试后,我决定在任何其他手机型号上尝试相同的测试用例。幸运的是,在使用我朋友的三星 S3 (4.1.1) 进行测试时,我的应用程序也可以在室内运行。在同一时间和地点,当我用我的 HTC One X 进行测试时,我没有在室内获得位置。两部手机都设置了相同的设置(WiFi/GPS/移动网络全部启用)。

为了确认这是特定设备的问题,我使用我的应用程序在建筑物内的不同角落进行了许多测试,我在 HTC 上的所有室内位置都看到了相同的问题(但在相同的位置 S3 获取室内位置)。

于 2013-05-29T20:54:35.553 回答
0

你确定你没有断开客户端?一旦断开 LocationClient,当前位置更新请求就会消失。

代码片段本身并不是一个完整的应用程序。但是,示例应用程序是一个完整的工作应用程序。片段的目的是向您展示关键步骤,您可以从中进行剪切和粘贴。示例应用程序提供了更多材料。

于 2013-05-28T23:37:02.527 回答