GetLastKnownLocation de NETWORK_PROVIDER en el teléfono devuelve null

OK, he pasado un montón de tiempo buscando y leyendo, y no solo este sitio web. La mayoría de los hilos tratan con GPS o tratan de hacerlo funcionar en un emulador. La documentación en developer.android.com sólo explica hasta cierto punto. No puedo conseguir una cosa simple para trabajar. Como la mayoría de las personas con este problema, sólo quiero obtener la última ubicación conocida del proveedor de la red y no lo conseguirá, incluso después de usar mapas de Google (utilizando el proveedor de la red porque el GPS estaba apagado) y me mostró Sólo 1/8 a 1/4 milla de distancia. Ok, por lo que el "proveedor" (torres de celulares / wi-fi si está encendido) está recibiendo una solución para los mapas de Google. Intento mi aplicación y no puedo obtener la última ubicación conocida. Ni siquiera estoy intentando mostrarlo en Maps, lo estoy imprimiendo las coordenadas lat y long a la pantalla después de presionar un botón para obtener la ubicación. La documentación no dice nada sobre la última ubicación que tiene que hacerse de la misma actividad. Dice que devolverá la última ubicación conocida del proveedor especificado. Estoy especificando NETWORK_PROVIDER que la documentación dice es torres de celulares y wi-fi. (Y sí, tengo que cubierto en el manifiesto.)

¿Alguien sabe cómo funciona esto? Todavía tengo que ver una buena explicación, incluso en el sitio de Google. Si no sabes, estoy frustrado. Obviamente es algo que estoy haciendo (o no), así que no estoy culpando a nadie / a nadie excepto a mí, excepto por la documentación que se queda un poco demasiado corto para mis necesidades.

ACTUALIZACIÓN: Ahora estoy utilizando un oyente de localización y obtener una ubicación, supongo que la última ubicación. Parece lógico ser capaz de obtener la última ubicación sin iniciar las actualizaciones de ubicación a través de un oyente de ubicación, pero no lo era, y ahora estoy con un oyente de localización.

Ahora mi problema es que no puedo conseguir que la ubicación cambie. Mi código no hace nada ahora, excepto intentar obtener actualizaciones de ubicación a través del oyente, y también aceptar una pulsación de botón para capturar la última ubicación conocida. Google Maps me mostrará dónde estoy, pero sigo recibiendo una ubicación a 20 millas de distancia en mi código. Tengo la sensación de que hay una posibilidad de que pueda estar recibiendo una nueva ubicación, pero podría tener un uso defectuoso de declaraciones finales / estáticas que me impiden almacenar y usar esa ubicación cuando la necesito. Mi manifiesto tiene permisos de internet y de ubicación fina, y el xml para la actividad funciona correctamente. Sólo proporciona un botón para activar / desactivar la búsqueda en vivo de la ubicación, un botón para recuperar manualmente la ubicación lastknown y un texto para mostrar la latitud y la longitud. He tratado de despojar lo no esencial para evitar que esto sea demasiado largo.

public class RMain extends Activity { public boolean islivesearchon; public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters private static Location currentlocation; private LocationManager locationManager; private LocationListener locationListener; public static Criteria criteria; public TextView latview; public TextView longview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rmain); latview = (TextView) findViewById(R.id.display_latitude); longview = (TextView) findViewById(R.id.display_longitude); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // setup bestProvider criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); String bestprovider = locationManager.getBestProvider(criteria, true); // get an initial current location currentlocation = locationManager.getLastKnownLocation(bestprovider); latview.setText(Double.toString(currentlocation.getLatitude())); longview.setText(Double.toString(currentlocation.getLongitude())); // Define locationListener interface locationListener = new LocListener(); // React to LiveSearch toggle button press final Button livesearch = (Button) findViewById(R.id.button_livesearch); livesearch.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { TextView livesearchview = (TextView) findViewById(R.id.button_livesearch); boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if(islivesearchon) { locationManager.removeUpdates(locationListener); islivesearchon = false; livesearchview.setText("Live Search is OFF"); } else { // ideally should check for !isProviderEnabled first, then provide option for turning it on if(isNetEnabled) { locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener); islivesearchon = true; livesearchview.setText("Live Search is ON"); } // ideally should check for !isProviderEnabled first, then provide option for turning it on if(isGpsEnabled) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener); islivesearchon = true; livesearchview.setText("Live Search is ON"); } } } }); // Respond to Get Location button click to get last known location final Button getlocation = (Button) findViewById(R.id.button_getlocation); getlocation.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String bestprovider = locationManager.getBestProvider(criteria, true); Location lastlocation = locationManager.getLastKnownLocation(bestprovider); latview.setText(Double.toString(lastlocation.getLatitude())); longview.setText(Double.toString(lastlocation.getLongitude())); } }); } private class LocListener implements LocationListener { @Override public void onLocationChanged(Location latestlocation) { // Called when a new location is found by the network location provider. currentlocation.set(latestlocation); latview.setText(Double.toString(currentlocation.getLatitude())); longview.setText(Double.toString(currentlocation.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) {} @Override public void onProviderEnabled(String provider) {} @Override public void onProviderDisabled(String provider) {} }; 

}

Trate de comprobar con esto … una vez que su onLocationChange se llama, después de que los antiguos valores que puede obtener utilizando la última ubicación conocida.

  locationManager = (LocationManager)this.getSystemService(LOCATION_SERVICE); location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { old_latitude=location.getLatitude(); old_longitude=location.getLongitude(); Log.d("old","lat : "+old_latitude); Log.d("old","long : "+old_longitude); this.onLocationChanged(location); } 

Devuelve 'nulo', cuando el servicio está desactivado en Ajustes> Ubicación y Seguridad> ubicación a través de la red

Así que eso puede suceder muy a menudo.

  • GetLastKnownLocation () Android, cuando se actualiza la última ubicación conocida?
  • Tiempo de viaje entre dos ubicaciones en Google Map Android API V2
  • Obtener el radio del mapa visible en Android
  • Cómo implementar onConnectionFailed () y onDisconnected () para un servicio de ubicación
  • encontrar la farmacia más cercana en google maps
  • Android simulacro de ubicación en el dispositivo?
  • Mapview NullPointerException android
  • No se puede encontrar la ubicación actual dentro del fragmento
  • Cómo serializar para la clase android.location?
  • No se encontraron clases de API selectiva de Google Play Services
  • Activar servicios de ubicación sin navegar a la página de configuración
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.