¿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.
- Android: cómo arreglar gps con simulacros (falso) de coordenadas?
- LocationClient getLastLocation () devolver null
- Android - Cómo determinar si las coordenadas se encuentran en la carretera en Google Maps
- Se pierde el proveedor de Android Fused Location
- Emulador de Android se reinicia cuando se envía una ubicación falsa
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.
- Uso de una ubicación simulada en la aplicación de navegación
- Cómo falsificar la ubicación para hacer pruebas con LocationClient y Geofences en Android?
- La API de ubicación de Google Play Service devuelve una ubicación incorrecta a veces
- ¿Android ProximityAlert o Geofence drenan más batería cuando el teléfono está más cerca de una ubicación supervisada?
- LocationManager.getLastKnownLocation () return null
- Obtener un total de "Zonas / Zonas" en las que actualmente estoy, basado en la ubicación actual
- Android: ¿Una forma sencilla de hacer una geofence?
- Google maps containsLocation en android
¿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); }