android location-client

android - onLocationChanged no se llama en algunos dispositivos



location-client (7)

Aquí mira este código ...

public class MyActivity extends Activity implements LocationListener { double destLat, destLong; LocationManager locationManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub destLat = location.getLatitude(); destLong = location.getLongitude(); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub }

Esta es una pregunta que se ha hecho muchas veces, pero no pude encontrar una solución que siempre funcione.

Estoy desarrollando una aplicación utilizando el proveedor de ubicación Fused. En el método onConnected() , onConnected() actualizaciones de ubicación y la lógica de la aplicación se iniciará una vez que se genere un arreglo de ubicación y se onLocationChanged() . (Por favor refiérase a mi código a continuación).

El problema en el método onLocationChanged() nunca se llama en algunos dispositivos. Yo uso un Samsung Tab 2 y un Samsung Galaxy Grand para las pruebas. Este código funciona perfectamente bien en la pestaña 2, pero no funciona en Grand. Por no funciona, quiero decir que locationClient se conecta pero nunca se llama a onLocationChanged() .

Anteriormente, utilicé el administrador de ubicación para obtener la ubicación y en esa implementación, ocurrió el mismo problema. Por lo tanto, traté de implementar el proveedor de ubicación fusionada, pero sigo teniendo el mismo problema.

¿Puede alguien ayudarme con este problema? ¿Hay algo que me estoy perdiendo aquí?

public class MainActivity extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, OnConnectionFailedListener, LocationListener { LocationClient locationclient; LocationRequest lr; Location loc1; static String address; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationclient = new LocationClient(this,this,this); locationclient.connect(); } @Override public void onConnected(Bundle arg0) { // TODO Auto-generated method stub lr=LocationRequest.create(); lr.setInterval(100); locationclient.requestLocationUpdates(lr, this); Log.d("LocationClient","On Connected"); } @Override public void onDisconnected() { // TODO Auto-generated method stub locationclient.disconnect(); } @Override public void onConnectionFailed(ConnectionResult arg0) { // TODO Auto-generated method stub } @Override public void onLocationChanged(Location loc) { // TODO Auto-generated method stub // Application Logic Log.d("LocationClient","Last Known Location LC:" + loc.getLatitude() + "," + loc.getLongitude()); } }


Comprueba si obtienes una ubicación aprobada al probar si (loc == null). A pesar de que es el mismo proveedor, tal vez un dispositivo está volviendo nulo y bombardeando, dando como resultado que no esté disparando.


Resolví esto configurando ambos parámetros, la distancia mínima y el tiempo mínimo entre las actualizaciones a 0. Según lo que he probado en 2 dispositivos, ahora se llama regularmente a onLocationChanged () después de solicitar actualizaciones.


Tal vez no tenga sentido, pero he enfrentado este problema anteriormente, alguien sugirió que debería crear su propio LocationListener lugar de dejar que su MainActivity implemente LocationListener . Básicamente esto:

locationclient.requestLocationUpdates(lr, your_location_listener);

Espero que esto ayude.


intente eliminar y reinstalar " google play services ". Instálelo desde el siguiente enlace de Google Market, servicios de Google Play.


onLocationChanged() mismo comportamiento en Galaxy Nexus y reconocí dos cosas que causaban que onLocationChanged() no fuera llamado. Existen

  1. La fuente de ubicación correspondiente no está habilitada en Configuración del sistema. Para PRIORITY_HIGH_ACCURACY los satélites GPS deben estar habilitados, para PRIORITY_BALANCED_POWER_ACCURACY ubicación de la red móvil y Wi-Fi debe estar habilitada.

  2. Incluso para las fuentes de ubicación habilitadas no puede haber información de ubicación válida disponible. Por ejemplo, la fuente PRIORITY_HIGH_ACCURACY está habilitada, pero no hay recepción GPS (o no es buena) (por ejemplo, el dispositivo está dentro de un edificio). O la fuente PRIORITY_BALANCED_POWER_ACCURACY está habilitada, pero tanto los datos de Wi-Fi como los móviles están apagados. En esos casos, no se puede detectar la ubicación y no se onLocationChanged() .

Para corregir el # 1 tuve que comprobar si las fuentes de ubicación requeridas están habilitadas incluso antes de conectarse a la API de servicios de Google y si están desactivadas, notifiqué a un usuario que le pedía que permitiera el acceso a la ubicación.

Para resolver el # 2 decidí usar LocationRequest.setExpirationDuration() . Establecí el tiempo de espera en aproximadamente 10 segundos, e inmediatamente después de llamar a requestLocationUpdates() una devolución de llamada retrasada en los mismos 10 segundos. Si se llama a la devolución de llamada retrasada antes de requestLocationUpdates() , esto significa que no se puede detectar la ubicación debido a la razón # 2. Hago tres reintentos y luego le muestro al usuario un mensaje de error.

La documentación de Android no es buena en este lugar, por eso espero que esto ayude.


lr.setInterval(100);

con él, su intervalo es de 0,1 segundos, por lo que es muy difícil que el chipset GPS detecte la ubicación. Tu intervalo debe ser> 1 segundo. (Conmigo es> 10)

locationRequest se debe establecer:

setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) porque PRIORITY_BALANCED_POWER_ACCURACY en el exterior no tiene ubicación. El código se verá como

lr=LocationRequest.create(); lr.setInterval(5 * 1000);// 5s lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationclient.requestLocationUpdates(lr, this);

Espero que esto ayude.