我想要做的就是在进入下一个活动之前使用GPS获取当前位置。所以我禁用了将我带到下一个活动的按钮。只有在使用GPS获取位置后才能启用这些按钮。以下代码运行完美。但我发现了一个错误..
上次我使用该应用程序时,它非常正确。然后我搬到了我的大学。在那里,我启动了应用程序,然后移动到下一个活动,因为当时检索了位置。我得到了我家的位置,距离大约10公里。关闭应用程序后,我再次启动它,这次它检索到了正确的位置。
嗯,这是因为以下几行:
location = locationManagerAsync.getLastKnownLocation(providerAsync);
我的应用正在检索最后一个位置并启用按钮。但它能够在下次启动应用程序时保留当前位置。结果,在第二次尝试时,完美地检索位置。
我在stackoverflow.com上使用了一个问题的代码,如下所示。
private class MyLocationTracker extends AsyncTask<Void, Void, Void> implements LocationListener {
private Context ContextAsync;
public MyLocationTracker (Context context){
this.ContextAsync = context;
}
Dialog progress;
private String providerAsync;
private LocationManager locationManagerAsync;
double latAsync=0.0;
double lonAsync=0.0;
Location location;
@Override
protected void onPreExecute() {
super.onPreExecute();
progress = ProgressDialog.show(ContextAsync, "Loading location", "Please wait...");
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
locationManagerAsync = (LocationManager) ContextAsync.getSystemService(ContextAsync.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
providerAsync = locationManagerAsync.getBestProvider(criteria, false);
if (locationManagerAsync.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
providerAsync = LocationManager.GPS_PROVIDER;
} else if (locationManagerAsync.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
providerAsync = LocationManager.NETWORK_PROVIDER;
} else if (locationManagerAsync.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) {
providerAsync = LocationManager.PASSIVE_PROVIDER;
//Toast.makeText(ContextAsync, "Switch On Data Connection!!!!", Toast.LENGTH_LONG).show();
}
location = locationManagerAsync.getLastKnownLocation(providerAsync);
// Initialize the location fields
if (location != null) {
// System.out.println("Provider " + provider + " has been selected.");
latAsync = location.getLatitude();
lonAsync = location.getLongitude();
} else {
//Toast.makeText(ContextAsync, " Location not available", Toast.LENGTH_SHORT).show();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
progress.dismiss();
onLocationChanged(location);
Log.v("latAsync_lonAsync",latAsync+"_"+lonAsync);
myCurrentLatitude = latAsync;
myCurrentLongitude = lonAsync;
// the buttons that were disabled in the onCreate() method
police.setEnabled(true);
medical.setEnabled(true);
fireService.setEnabled(true);
cityCorporation.setEnabled(true);
telePhnCall.setEnabled(true);
getRoute.setEnabled(true);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
这是我用来从Oncreate()方法调用AsyncTask的行。
new MyLocationTracker(TypeOfEmergency.this).execute();
现在的问题是,我不希望检索最后一个位置并将其存储在变量中。我删除了行
后尝试了代码 location = locationManagerAsync.getLastKnownLocation(providerAsync);
但在这种情况下应用程序崩溃了。需要快速解决。
这是错误日志::(在查看错误日志之前,请查看注释)
答案 0 :(得分:0)
代码中的内容基本上是错误的:onLocationChanged
locationManagerAsync.requestLocationUpdates(providerAsync, 0, 0, this);
需要在doInBackground
的末尾调用(不需要在后台完成)。该代码行从提供者(例如GPS提供者)请求位置更新。当新位置可用时,您的位置监听器的onLocationChanged
会被调用(由于上面一行中的MyLocationTracker
,您的示例中为this
。onLocationChanged
您需要getLastKnownLocation
通过启用或禁用您在问题中提到的功能来对新位置做出反应。
对{{1}}的调用完全符合名称的含义:它返回最后一个已知的位置,这可能已经很久了。