android - number - IllegalArgumentException: el proveedor no existe: null en Maps V1
no int int argument constructor factory method to deserialize from number value (3)
Estoy usando la API de Google Maps V1. Tengo este error:
java.lang.IllegalArgumentException: provider doesn''t exisit: null
Este es mi código:
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String provider = locationManager.getBestProvider(criteria, true);
if (provider != null)
{
startTime = System.currentTimeMillis();
geoLocTimeOutTask = new GeoLocTimeOutTask();
geoLocTimeOutTask.execute();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}
else
{
geoLocCallbackObj.geoLocationCallback(tagCallback);
}
Entiendo el error, pero mi pregunta es, ¿por qué el dispositivo me puso este error? ¿Y cómo puedo evitar esto por favor?
Cuando el proveedor no es compatible, obtiene un error, la forma más sencilla de deshacerse de este problema es utilizar un criterio.
locationManager.requestLocationUpdates(locationManager.(new Criteria(),true), 0, 0, locationListener);
En el codigo
criterios - los criterios que deben ser emparejados
El segundo arg que es un booleano:
enabledOnly: si es verdadero, solo se devuelve un proveedor actualmente habilitado
Está solicitando actualizaciones del proveedor de la red cuando ese proveedor no existe en el dispositivo. Puede reemplazar estas dos líneas:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
con
locationManager.requestLocationUpdates(provider, 0, 0, locationListener);
Ya ha hecho el esfuerzo de encontrar el mejor proveedor que el dispositivo ofrece para sus criterios, de modo que es el que debe utilizar.
Alternativamente, compruebe que el proveedor existe antes de registrarse para recibir actualizaciones de él:
if (locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
También estás usando cero para el tiempo y la distancia mínima. Esto es perfecto para probar en un dispositivo virtual, pero recuerde cambiarlos cuando use un dispositivo real, de lo contrario, la carga de la batería será alta.
se sugirió que se corrigiera esto sería usar la nueva API de ubicación en lugar de la anterior http://developer.android.com/google/play-services/location.html
Pero en realidad todo lo que tienes que hacer es hacer una comprobación.
if(locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER) && locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}
Si el proveedor no está habilitado, no pasará ni se bloqueará.