我正在编写一个应用程序,它需要用户的当前位置(lastknownlocation 不会非常有用),并从数据库中显示所有最接近他们的“物品”列表。
我已经成功地找到了最接近物品的方法,但目前只使用硬编码的纬度和经度位置,现在是时候实现查找实际位置了。
有人能提供一个示例,演示如何使应用程序在后台查找当前精细位置,并等待应用程序。我只需要一次位置,而不是随着人移动而更新。我已经实现了位置监听器,但我明白获得GPS定位可能很慢。我已看到其他示例使用上次已知位置或实现持续运行和更新的位置监听器,但由于我的Activity需要位置坐标才能显示任何内容,应用程序就会崩溃。我需要在搜索时显示进度对话框。
如何让locationlistener 在后台仅运行一次,然后在找到位置后删除位置更新。我需要其余的应用程序等待GPS位置,或者在20-30秒后超时。如果可能,我希望用户能够取消对话框,如果他们等候这个操作感到烦了,他们可以通过输入区域等来进行搜索。
我一直试图用线程完成这个任务,但是它比我预想的要复杂得多,而且还无法正常工作。在iPhone上,这要简单得多?
有人能提供一种不错的方法吗?我已经为此挣扎了一个星期,它真的使我落后于应用程序的其余部分完成日期。
总之,我想要:
* 找到当前坐标
* 在获取位置时显示进度对话框
* 应用程序可以等待成功的位置或在一定时间后放弃?
* 如果成功:关闭进度对话框,并使用坐标运行我的其他查找附近物品的方法。
* 如果未能获得位置:关闭进度对话框并显示错误消息,并鼓励用户使用菜单进入搜索活动。
* 如果用户从菜单中选择了地图视图,则使用这些坐标显示地图上的当前位置,并使用数据库中所匹配的所有附近项目的坐标来放置大头针。
谢谢您们,我希望我已经解释得足够清楚。如果有任何问题,请随时问我,因为我渴望完成这一部分。 Cheers
编辑 请求代码 locationList activity file
我已经成功地找到了最接近物品的方法,但目前只使用硬编码的纬度和经度位置,现在是时候实现查找实际位置了。
有人能提供一个示例,演示如何使应用程序在后台查找当前精细位置,并等待应用程序。我只需要一次位置,而不是随着人移动而更新。我已经实现了位置监听器,但我明白获得GPS定位可能很慢。我已看到其他示例使用上次已知位置或实现持续运行和更新的位置监听器,但由于我的Activity需要位置坐标才能显示任何内容,应用程序就会崩溃。我需要在搜索时显示进度对话框。
如何让locationlistener 在后台仅运行一次,然后在找到位置后删除位置更新。我需要其余的应用程序等待GPS位置,或者在20-30秒后超时。如果可能,我希望用户能够取消对话框,如果他们等候这个操作感到烦了,他们可以通过输入区域等来进行搜索。
我一直试图用线程完成这个任务,但是它比我预想的要复杂得多,而且还无法正常工作。在iPhone上,这要简单得多?
有人能提供一种不错的方法吗?我已经为此挣扎了一个星期,它真的使我落后于应用程序的其余部分完成日期。
总之,我想要:
* 找到当前坐标
* 在获取位置时显示进度对话框
* 应用程序可以等待成功的位置或在一定时间后放弃?
* 如果成功:关闭进度对话框,并使用坐标运行我的其他查找附近物品的方法。
* 如果未能获得位置:关闭进度对话框并显示错误消息,并鼓励用户使用菜单进入搜索活动。
* 如果用户从菜单中选择了地图视图,则使用这些坐标显示地图上的当前位置,并使用数据库中所匹配的所有附近项目的坐标来放置大头针。
谢谢您们,我希望我已经解释得足够清楚。如果有任何问题,请随时问我,因为我渴望完成这一部分。 Cheers
编辑 请求代码 locationList activity file
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the stuff that requires current location
}
}
public LocationResult locationResult = new LocationResult()
{
@Override
public void gotLocation(final Location location)
{
currentLocation = location;
}
};
LocationHelper 类
package org.xxx.xxx.utils;
import java.util.Timer;
/*
imports
*/
public class LocationHelper
{
LocationManager locationManager;
private LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public boolean getLocation(Context context, LocationResult result)
{
locationResult = result;
if(locationManager == null)
{
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}
//exceptions thrown if provider not enabled
try
{
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch (Exception ex) {}
try
{
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch (Exception ex) {}
//dont start listeners if no provider is enabled
if(!gpsEnabled && !networkEnabled)
{
return false;
}
if(gpsEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
}
if(networkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
GetLastLocation();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
private void GetLastLocation()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
Location gpsLocation = null;
Location networkLocation = null;
if(gpsEnabled)
{
gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(networkEnabled)
{
networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//if there are both values use the latest one
if(gpsLocation != null && networkLocation != null)
{
if(gpsLocation.getTime() > networkLocation.getTime())
{
locationResult.gotLocation(gpsLocation);
}
else
{
locationResult.gotLocation(networkLocation);
}
return;
}
if(gpsLocation != null)
{
locationResult.gotLocation(gpsLocation);
return;
}
if(networkLocation != null)
{
locationResult.gotLocation(networkLocation);
return;
}
locationResult.gotLocation(null);
}
public static abstract class LocationResult
{
public abstract void gotLocation(Location location);
}
}
这个似乎为了只获取当前位置而付出了很大的努力?我不需要更新或其他任何东西?有没有更简单的方法让应用程序等待结果?我已经卡在这里很长时间了。