GPS Android - get positioning only once

后端 未结 2 1765
我寻月下人不归
我寻月下人不归 2020-12-01 06:03

Is there a way to access the GPS once instead of having a looper that constantly checks for location updates?

In my scenario all I\'m interested in is finding the cu

相关标签:
2条回答
  • 2020-12-01 06:42

    Dont use the getLastKnownLocation because that could be returning null or old data.

    This code Only fetches the location once a button is pressed and not every time. People use to leave the location listener listen in every instance and that kills the battery life so Use the code snippet I have posted by doing lots of research:

    // 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);
           }
       });
    
    0 讨论(0)
  • 2020-12-01 07:02

    First check if the last know location is recent. If not, I believe you must to set up onLocationChanged listener, but once you get your first valid location you can always stop the stream of updates.

    Addition

    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) {}
    }
    
    0 讨论(0)
提交回复
热议问题