在我的应用中检索地理位置远不如谷歌地图应用在我的设备上同时显示的准确性

时间:2014-03-31 02:28:50

标签: java android google-maps gps geolocation

在我的应用中,我尝试了两种访问位置的方法:

a)使用LocationManager和GPS_PROVIDER。如果准确度为50或更低,我接受要处理的位置。应用程序接收位置但是大部分时间都没有收到任何位置 - 而谷歌地图在我开始试用时会比我的应用程序更加精确地获取我的位置。

以下是与此相关的部分内容:

开始收听地点:

// in service class, function to start listening for locations.
// class implements android.location.LocationListener interface
this.locman = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);
if( !this.locman.isProviderEnabled(LocationManager.GPS_PROVIDER) ){
    Log.d("","GPS is not enabled");
}else{
    this.locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    this.onLocationChanged( this.locman.getLastKnownLocation(LocationManager.GPS_PROVIDER) );
}

onLocationChanged函数的android.location.LocationListener实现:

@Override
public void onLocationChanged(Location location) 
{
    ... showing provided Location on the map
}
清单文件中的

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

这可以给我相对频繁的更新,但有时会有巨大的差距。我相信连接足够的卫星可能是个问题,但是如果我同时打开谷歌地图 - 它可以完美运行。位置更新之间没有时间差距,而且比我在这里得到的更精确。

我认为可能需要使用LocationClient和LocationRequest,计算一下Google Play API可能会有一些内部插值/预测/提高精度的任何内容。

b)将GooglePlay API与LocationClient和LocationRequest配合使用。我已经安装了Google Play SDK,还尝试了Google的示例应用。这是我的相关代码:

// in service class, function to start listening for locations.
// class implements com.google.android.gms.location.LocationListener,
// com.google.android.gms.common.ConnectionResult.OnConnectionFailedListener and
// com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks interface
this.locclient = new LocationClient(this.getApplicationContext(),this,this);
this.locclient.connect();

实现onConnected:

@Override
public void onConnected(Bundle dataBundle) 
{
    LocationRequest req = LocationRequest.create();
    req.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    req.setInterval(2000); // 2 sec
    req.setFastestInterval(16); // 60 fps
    this.locclient.requestLocationUpdates(req, this);
}

当然onConnectionFailed和onDisconnected已经实现并且被断点化 - 永远不会进入,而onConnected被调用。

com.google.android.gms.location.LocationListener的实施:

@Override
public void onLocationChanged(Location location) 
{
    ... showing provided Location on the map
}

在这种情况下,我会立即获得更新,但不会超过200米或更长时间。

绝望之下,我尝试了Google Play上的MyLocation应用,它显示了相同的偏移!

当我尝试Google地图时,它同时显示的绝对准确度最高为5-6米。

重要提示:我位于中国上海。不确定这是否与任何方式有关。

如何才能在Google地图和Google自己的位置服务示例(MyLocationDemoActivity.java,google_play_services / samples / maps /中提供)之间实现如此巨大的抵消?澄清:谷歌的地图演示提供了Google Play服务示例代码,同时显示距离我的实际位置相同的偏差(约200米),同时谷歌地图应用程序显示精确的位置。

我使用Nexus 4作为开发平台。

编译器是ADT(Eclipse)。全部都是最新的。

真的希望这里的任何人能有一些快速的突破!提前谢谢!

P.S。

我现在尝试使用LocationRequest.PRIORITY_NO_POWER作为位置请求的设置,让我的应用仅在其他应用请求时才更新位置。然后,我启动了Google地图,然后切换回我的应用。它立即收到位置。我已将long / lat复制到http://maps.googleapis.com/maps/api/staticmap?center=31.229179,121.422615&zoom=16&format=png&sensor=false&size=640x640&maptype=roadmap进行测试,并显示相同的偏移量。虽然我手机上的Google地图显示的确切位置。

Google的地图是否有可能抵消?或者说收到长/拉特的偏移量?

2 个答案:

答案 0 :(得分:0)

我没有足够的声誉发表评论所以我正在写一个答案。

这很可能与中国的GPS偏移问题有关。中国政府坚持不允许用户在某些情况下记录准确的GPS数据(“国家安全有点啰嗦”),并迫使Apple / Google等公司遵守当地法律。

以下是有关该主题的一些有用信息的链接: http://www.sinosplice.com/life/archives/2013/07/16/a-more-complete-ios-solution-to-the-china-gps-offset-problem

答案 1 :(得分:0)

如上所述,抵消是因为中国政府的监管。然而,人们设法至少使用GoogleMaps和HEREMaps进行转换。它是用{C#编写的here。 使用它可以将真实坐标转换为最大误差为20米的变换坐标。还有更准确的实现。

如果您不想修改软件,可以使用基于this的内容。这是我使用LocationManager为所有应用程序转换坐标的简单Xposed模块。