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 current co-ordinates and not a continuous connection with the GPS satellite. Does anyone have any ideas how this can be done? Thanks in advance.
Before requesting location updates, your app must connect to location services and make a location request. The lesson on Changing Location Settings shows you how to do this. Once a location request is in place you can start the regular updates by calling requestLocationUpdates() .
GPS: Maps uses satellites to know your location up to around 20 meters. When you're inside buildings or underground, the GPS is sometimes inaccurate. Wi-Fi: The location of nearby Wi-Fi networks helps Maps know where you are. Cell tower: Your connection to mobile data can be accurate up to a few thousand meters.
The fused location provider is a location API in Google Play services that intelligently combines different signals to provide the location information that your app needs.
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); } });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With