【发布时间】:2016-06-30 10:19:21
【问题描述】:
由于我不定期地编写我的应用程序,我使用的一些 API 在我回来时已被弃用。
最值得注意的是 GPS API 的变化。让我感到困惑的是,较旧的 API 似乎提供了更好的结果(代码将随之而来)。
我正在使用 MapView,并且还使用较旧的方法(单独的 gps 和网络提供商)和较新的方法(“FusedLocation”)以编程方式获取 GPS 坐标。
我在谷歌地图中比较了这两个代码的坐标,虽然旧代码(单独使用 gps 和网络提供商)准确且稳定,但新代码(使用“FusedLocation”)偏离了几百米并且不稳定,尽管匹配mapView 指向的位置(意味着它们都不是那么准确并且不断变化)。
所以我的问题是,哪种方法是正确的使用方法?我想也许我的 FusedLocation 编码错误,但由于它与 MapView 匹配,我排除了这个。
旧代码,分别使用 GPS 和网络:
public Location getLocation() {
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(!isGPSEnabled && !isNetworkEnabled) {
} else {
this.canGetLocation = true;
if (isGPSEnabled) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
}
if(isNetworkEnabled) {
if(location == null) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if(locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
}
}
}
使用 FusedLocation 的新代码:
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
public boolean canGetLocation() {
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
try {
LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception e) {
e.printStackTrace();
return false;
}
//some more code
}
public void onConnected(Bundle bundle) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
【问题讨论】:
-
使用哪种方法正确? ...用于什么?为了获得确切的位置?不是他们......你应该设置监听器并等待提供者修复......似乎是来自androidhive的另一个“伟大”代码..
-
hahaha androidhive 规则
locationManager.requestLocationUpdates(...); if(locationManager != null) { ... }在您调用一次方法后立即检查locationManager是否为空有什么意义?为时已晚...如果locationManager为空,那么您将获得 NPE 行之前 .. -
而不是像我所说的那样模拟一个相当旧的代码,你能给我推荐一个更好的编码示例吗?或尝试帮助我理解为什么它实际上更准确?