¿Cómo obtener la posición GPS actual sin esperar cambios de ubicación en Android?

Quiero obtener la ubicación actual del dispositivo utilizando el proveedor de gps, pero esto realmente espera la posición de gps a cambiar.

Así que tengo una aplicación simple que escucha el cambio de ubicación. Esto funciona con NETWORK_PROVIDER instante, pero para GPS_PROVIDER esperé 15 minutos y no se ha producido ninguna acción.

Estoy usando el API de nivel 8.

 public class MainActivity extends Activity { TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) this.findViewById(R.id.textView1); LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationListener ll = new mylocationlistener(); //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll); // this works fine lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll); } private class mylocationlistener implements LocationListener { public void onLocationChanged(Location location) { Date today = new Date(); Timestamp currentTimeStamp = new Timestamp(today.getTime()); if (location != null) { Log.d("LOCATION CHANGED", location.getLatitude() + ""); Log.d("LOCATION CHANGED", location.getLongitude() + ""); String str = "\n CurrentLocation: " + "\n Latitude: " + location.getLatitude() + "\n Longitude: " + location.getLongitude() + "\n Accuracy: " + location.getAccuracy() + "\n CurrentTimeStamp " + currentTimeStamp + "\n Altitude: " + location.getAltitude() + "\n Bearing" + location.getBearing() + "\n Speed" + location.getSpeed() + "\n "; Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG) .show(); tv.append(str); } } public void onProviderDisabled(String provider) { Toast.makeText(MainActivity.this, "Error onProviderDisabled", Toast.LENGTH_LONG).show(); } public void onProviderEnabled(String provider) { Toast.makeText(MainActivity.this, "onProviderEnabled", Toast.LENGTH_LONG).show(); } public void onStatusChanged(String provider, int status, Bundle extras) { Toast.makeText(MainActivity.this, "onStatusChanged", Toast.LENGTH_LONG).show(); } } } 

Puse el permiso en el manifiesto, así que este no es el problema.

¿Está probando dentro? A menos que esté fuera, es posible que no obtenga un bloqueo de GPS en absoluto, lo que significa que el teléfono intentará obtener un bloqueo tan a menudo como pueda (ya que ha especificado 0 y 0 para el tiempo mínimo y la distancia en su requestLocationUpdates llamada ).

Por desgracia, sólo tienes que esperar a que el dispositivo para obtener un bloqueo de GPS, y si no lo hace debido a la falta de señal, que simplemente seguir esperando. Lo primero que puede hacer para aliviar esto es tratar de obtener la última ubicación conocida para el proveedor de GPS. Esto devolverá una ubicación si el dispositivo recientemente tenía un bloqueo de GPS y almacenó una ubicación:

 Location lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

Aparte de eso, sólo debe tratar de obtener la ubicación del proveedor de la red, ya que es probable que devuelva una ubicación mucho más rápido que el GPS, como ya se ha observado. Esto se debe a la abundancia de fuentes de datos de localización (torres de celulares y WIFI), que están disponibles en todas partes, incluso en interiores, siempre y cuando tenga una señal inalámbrica.

 try{ LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER); Location location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); double longitude = location.getLongitude(); double latitude = location.getLatitude(); String stlongitude = Double.toString(longitude); String stlatitude = Double.toString(latitude); TextView celllocation = (TextView) findViewById(R.id.txtCellLocation); celllocation.setText(stlatitude + " , " + stlongitude); //String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude); //Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); //startActivity(intent); } catch (Exception a) { LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double longitude = location.getLongitude(); double latitude = location.getLatitude(); String stlongitude = Double.toString(longitude); String stlatitude = Double.toString(latitude); TextView celllocation = (TextView) findViewById(R.id.txtCellLocation); celllocation.setText(stlatitude + " , " + stlongitude); } 
  • Emulador de Android - DDMS "control de emulador" está deshabilitado mientras ejecuta buildroid / emulador basado en virtualbox
  • Número GPS de satélites y filtrado de ubicaciones
  • Uso del sensor de orientación para apuntar hacia una ubicación específica
  • Uso del servicio LocationClient de Google Play Services en segundo plano
  • La actualización de la ubicación del fondo Android no aparece cuando la pantalla está desactivada
  • Diferencia entre LocationRequest setInterval (long millis) y LocationRequest setFastestInterval (long millis)
  • Conmutación entre proveedor de red y GPS
  • Obtener la distancia más corta desde un punto
  • Cómo comprobar la ubicación de Mock en Android Marshmallow?
  • Ubicación Actualización en función del estado del dispositivo
  • ¿Cómo afecta la función Doze / Standby a las actualizaciones de ubicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.