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
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, paraPRIORITY_BALANCED_POWER_ACCURACY
ubicación de la red móvil y Wi-Fi debe estar habilitada.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 fuentePRIORITY_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 seonLocationChanged()
.
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.