GPS Android - 仅获取一次定位
Posted
技术标签:
【中文标题】GPS Android - 仅获取一次定位【英文标题】:GPS Android - get positioning only once 【发布时间】:2012-05-18 10:59:11 【问题描述】:有没有办法访问 GPS 一次,而不是让 Looper 不断检查位置更新?
在我的场景中,我感兴趣的只是找到当前坐标,而不是与 GPS 卫星的持续连接。有谁知道如何做到这一点?提前致谢。
【问题讨论】:
【参考方案1】:不要使用 getLastKnownLocation,因为这可能会返回 null 或旧数据。
此代码仅在按下按钮后获取位置,而不是每次。人们习惯于让位置监听器在每个实例中都监听,这会缩短电池寿命,所以请使用我通过大量研究发布的代码 sn-p:
// get the text view and buttons from the xml layout
Button button = (Button) findViewById(R.id.btnGetLocation);
final TextView latitude = (TextView) findViewById(R.id.textview4);
final TextView longitude = (TextView) findViewById(R.id.textview5);
final LocationListener locationListener = new LocationListener()
@Override
public void onLocationChanged(Location location)
mlocation = location;
Log.d("Location Changes", location.toString());
latitude.setText(String.valueOf(location.getLatitude()));
longitude.setText(String.valueOf(location.getLongitude()));
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
Log.d("Status Changed", String.valueOf(status));
@Override
public void onProviderEnabled(String provider)
Log.d("Provider Enabled", provider);
@Override
public void onProviderDisabled(String provider)
Log.d("Provider Disabled", provider);
;
// Now first make a criteria with your requirements
// this is done to save the battery life of the device
// there are various other other criteria you can search for..
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setSpeedRequired(false);
criteria.setCostAllowed(true);
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);
// Now create a location manager
final LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// This is the Best And IMPORTANT part
final Looper looper = null;
// Now whenever the button is clicked fetch the location one time
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
locationManager.requestSingleUpdate(criteria, locationListener, looper);
);
【讨论】:
是的,太好了 @msmukesh4 明确一点,这个位置监听器只能工作一次,对吧?我的意思是……如果我单击一次按钮,它会进行一次更新,并且即使位置发生变化,之后也不会更新,对吧? 这是一个非常好的答案。非常感谢。 老兄,你救了我的命。我不知道这个答案如何不被接受。非常感谢! @msmukesh4 很好的答案,但是这冻结了 UI(主线程上的工作太多)并且异步调用无法获取位置更新。【参考方案2】:首先检查最后知道的位置是否是最近的。如果没有,我相信您必须设置 onLocationChanged 侦听器,但是一旦您获得第一个有效位置,您就可以随时停止更新流。
加法
public class Example extends Activity implements LocationListener
LocationManager mLocationManager;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location != null && location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000)
// Do something with the recent location fix
// otherwise wait for the update below
else
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
public void onLocationChanged(Location location)
if (location != null)
Log.v("Location Changed", location.getLatitude() + " and " + location.getLongitude());
mLocationManager.removeUpdates(this);
// Required functions
public void onProviderDisabled(String arg0)
public void onProviderEnabled(String arg0)
public void onStatusChanged(String arg0, int arg1, Bundle arg2)
【讨论】:
是的,这正是我的问题,我设置了一个 onLocationChanged,我只想获得一个有效的位置..如何停止更新流?有什么命令吗?谢谢 简短回答 LocationManager.removeUpdates()。长答案,请参阅我的更新。 如果条件,上面的location.getTime() > Calendar.getInstance().getTimeInMillis() - 2 * 60 * 1000
是什么意思?
@2619 由于时间以毫秒为单位,乘以 1000 得到秒,再乘以 60 得到 1 分钟,再乘以 2 得到总时间 2 分钟。因此,if 语句检查位置是否在 2 分钟前收到。
一个好方法,但我在自己的项目中注意到的是,如果最后一个已知位置没有改变(即使它在时间方面已经过时),那么onLocationChanged
事件将不会触发。因此,如果您只依赖此调用来执行任何操作,则由于未触发事件,因此将无法到达该调用。以上是关于GPS Android - 仅获取一次定位的主要内容,如果未能解决你的问题,请参考以下文章