我正在尝试获取新导航应用的用户位置。 我想经常检查用户位置,它必须准确。 我使用示例中的以下代码来获取位置。
public class MainActivity extends Activity implements LocationListener {
private LocationManager locationManager;
private String provider;
private TextView a;
private TextView b;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a = (TextView) findViewById(R.id.a);
b = (TextView) findViewById(R.id.b);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
} else {
a.setText("Location not available");
b.setText("Location not available");
}
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider,0, 1, this);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
Double lat = location.getLatitude();
Double lng = location.getLongitude();
a.setText(String.valueOf(lat));
b.setText(String.valueOf(lng));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
}
但是当我移动时,位置坐标没有更新,我总是得到一个恒定值... 有没有更好的方法来获取位置?根据Android docs,我可以使用Google Play位置服务或Android平台位置API。 我检查了两者的示例代码,它实现了LocationListener接口以获取用户位置。那么它们之间的实际区别是什么?
答案 0 :(得分:23)
绝对使用新的Google Play定位服务。他们在室内工作比老位置经理好得多。我创建了一个使用新的Google Play定位服务的示例,并定期在后台运行。看看:
https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android
答案 1 :(得分:3)
当我使用它时,我遇到了两个很好的来源:
博文:Android Location Fused Provider。它包含一个很好的完整教程,介绍如何使用FusedLocationProviderApi在Android中获取位置。
关于Android LocationClient class is deprecated but used in documentation问题的答案。
基本上两者都谈到了Google I / O会话中提到的类似步骤,其中一个答案中提到了链接:
首先,获取GoogleClientApi
个实例,例如:
GoogleClientApi googleApiClient = new GoogleApiClient.Builder(locationActivity)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
然后点击.connect()
就像:
googleApiClient.connect();
然后在回调onConnected
中,获取最后一个位置,甚至可以根据您的需要请求位置更新,例如:
LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
如果您想要更新请求位置,则可以使用requestLocationUpdates来电。
希望它有所帮助。