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

Java 在我的应用程序中检索地理位置远不如谷歌地图应用程序在我的设备上同时显示的准确,java,android,google-maps,gps,geolocation,Java,Android,Google Maps,Gps,Geolocation,在我的应用程序中,我尝试了两种访问位置的方法: a) 使用LocationManager和GPS_提供程序。我接受精度为50或更低的待处理位置。应用程序接收到位置,但大多数时候根本没有接收到任何位置——而谷歌地图在我启动并试用时,会不断得到我的位置,而且比我的应用程序更精确 以下是与此相关的部分来源: // in service class, function to start listening for locations. // class implements com.google.and

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

a) 使用LocationManager和GPS_提供程序。我接受精度为50或更低的待处理位置。应用程序接收到位置,但大多数时候根本没有接收到任何位置——而谷歌地图在我启动并试用时,会不断得到我的位置,而且比我的应用程序更精确

以下是与此相关的部分来源:

// 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();
开始收听以下位置:

// 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" />
实施OnConnect:

@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被实现并被断点-从不进入,而OnConnectiond被调用

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

@Override
public void onLocationChanged(Location location) 
{
    ... showing provided Location on the map
}
在这种情况下,我会立即得到更新,但会有大约2亿或更多的更新

在绝望中,我尝试了谷歌Play上的MyLocation应用程序,它显示了相同的偏移量

同时,当我尝试谷歌地图时,它显示出绝对的准确性,最多5-6米

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

谷歌地图和谷歌自己的定位服务示例(MyLocationDemoActivity.java,在Google_play_services/samples/Maps/中提供)之间怎么可能存在如此巨大的偏移??澄清一下:谷歌地图演示提供了谷歌Play服务示例代码,也显示了与我的真实位置相同的偏移量(~200m),同时谷歌地图应用程序显示了精确的位置

我使用Nexus4作为开发平台

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

真的希望这里的任何人都能迅速取得突破!!!提前谢谢

附言

我现在尝试使用LocationRequest.PRIORITY\u NO\u POWER作为位置请求的设置,使我的应用程序仅在另一个应用程序请求时获得位置更新。然后我启动了谷歌地图,并切换回我的应用程序。它立即收到了地址。我将long/lat复制到中进行测试,它显示相同的偏移量。而我手机上的谷歌地图显示了确切的位置


谷歌的地图有可能有偏移量吗?或者收到的long/lat有一个偏移量?

我还没有足够的声誉来评论,所以我正在写一个答案

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

以下是有关该主题的一些好信息的链接:

如上所述,抵消是因为中国政府的监管。然而,人们设法得到了至少谷歌地图和HEREMaps使用的转换。它是用C写的。 使用它,您可以将实际坐标转换为最大误差为20米的转换坐标。还有更精确的实现


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

我能想到的唯一解决方法是添加长/横向偏移校正。对于上海,至少在我可以测试的地方,偏移量是:double long_off=0.004535;双lat_off=-0.001779;我在户外(街道、广场)和室内(咖啡馆等)四处走动(很多)来测试这一点。一旦我将此偏移量添加到应用程序中收到的long/lat,我就可以在……上打开地图。。。。。。。看看我的正确位置。但这远不是真正的解决方案。谢谢你的评论。有趣的是苹果地图和谷歌地图是如何正常工作的。不管怎么说,我已经创建了一个制作工具,可以比较百度、谷歌和其他几个来源的地图在同一个GPS位置上的差异,并找到一种方法来计算中国理想城市的偏移量。有趣的是,偏移量并不是所有城市都一样,但可以有很大的不同。因此,我有一些带有修正偏移量的电子表格,作为临时解决办法。我认为政府为谷歌/苹果提供了与你使用的数据集类似的数据集,以换取他们让他们的应用程序符合政府的意愿。我读到一些东西,给自己一个准确的单一位置是可以的,但记录“路径”的确切位置是不允许的。或者类似的。