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 - 仅获取一次定位的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 gps 定位模式的 Android 地理围栏监控

一般 Android GPS 行为

Android GPS驱动

Android GPS驱动

Cordova 地理定位插件无法从 Android 的 GPS 获取位置

仅使用 GPS 无线电进行高精度 webkit 地理定位