ubicacion studio obtener localizacion google geolocalizacion direccion coordenadas activar java android gps locationmanager

java - studio - GPS Android-consigue posicionarse solo una vez



obtener direccion android studio (2)

No use getLastKnownLocation porque podría estar devolviendo datos nulos o antiguos.

Este código solo recupera la ubicación una vez que se presiona un botón y no siempre. La gente suele dejar la escucha de ubicación en cada instancia y eso mata la vida útil de la batería, así que usa el fragmento de código que he publicado haciendo mucha investigación:

// 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); } });

¿Hay una manera de acceder al GPS una vez en lugar de tener un looper que comprueba constantemente las actualizaciones de ubicación?

En mi caso, todo lo que me interesa es encontrar las coordenadas actuales y no una conexión continua con el satélite GPS. ¿Alguien tiene alguna idea de cómo se puede hacer esto? Gracias por adelantado.


Primero verifica si la última ubicación conocida es reciente. Si no, creo que debes configurar el servicio de escucha onLocationChanged, pero una vez que obtengas tu primera ubicación válida, siempre puedes detener el flujo de actualizaciones.

Adición

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) {} }