Mi ubicación actual siempre devuelve nulo. ¿Cómo puedo arreglar esto?

Estoy tratando de encontrar mi ubicación actual para un proyecto de Android. Cuando se carga la aplicación, mi ubicación actual siempre es nula. Configuré los permisos en el manifiesto, etc. Cuando encuentro la ubicación actual, bash utilizar las coordenadas para buscar distancias a otras ubicaciones en el mapa. Mi fragmento de código está a continuación. ¿Por qué siempre obtengo un valor nulo?

locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria crit = new Criteria(); towers = locMan.getBestProvider(crit, false); location = locMan.getLastKnownLocation(towers); if (location != null) { System.out.println("Location is not null!"); lat = (int) (location.getLatitude() *1E6); longi = (int) (location.getLongitude() * 1E6); GeoPoint ourLocation = new GeoPoint(lati, longi); OverlayItem overlayItem = new OverlayItem(ourLocation, "1st String", "2nd String"); CustomPinpoint custom = new CustomPinpoint(d, MainMap.this); custom.insertPinpoint(overlayItem); overlayList.add(custom); overlayList.clear(); } else { System.out.println("Location is null! " + towers); Toast.makeText(MainMap.this, "Couldn't get provider",Toast.LENGTH_SHORT) .show(); } 

getLastKnownLocation() usa las ubicaciones encontradas anteriormente por otras aplicaciones. si ninguna aplicación lo ha hecho, getLastKnownLocation() devolverá nulo.

Una cosa que puede hacer con su código para tener una mejor oportunidad de obtener la última ubicación conocida: iterar sobre todos los proveedores habilitados, no solo con el mejor proveedor. por ejemplo,

 private Location getLastKnownLocation() { List providers = mLocationManager.getProviders(true); Location bestLocation = null; for (String provider : providers) { Location l = mLocationManager.getLastKnownLocation(provider); ALog.d("last known location, provider: %s, location: %s", provider, l); if (l == null) { continue; } if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { ALog.d("found best last known location: %s", l); bestLocation = l; } } if (bestLocation == null) { return null; } return bestLocation; } 

si su aplicación no puede funcionar sin tener una ubicación, y si no hay una última ubicación conocida, deberá escuchar las actualizaciones de ubicación. puedes echar un vistazo a esta clase para ver un ejemplo,

https://github.com/farble1670/autobright/blob/master/src/org/jtb/autobright/EventService.java

vea el método onStartCommand() , donde verifica si el proveedor de red está habilitado. si no, usa la última ubicación conocida. si está habilitado, se registra para recibir actualizaciones de ubicación.

si encuentra la ubicación actual de los dispositivos, use el siguiente método en la clase principal

 public void find_Location(Context con) { Log.d("Find Location", "in find_location"); this.con = con; String location_context = Context.LOCATION_SERVICE; locationManager = (LocationManager) con.getSystemService(location_context); List providers = locationManager.getProviders(true); for (String provider : providers) { locationManager.requestLocationUpdates(provider, 1000, 0, new LocationListener() { public void onLocationChanged(Location location) {} public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }); Location location = locationManager.getLastKnownLocation(provider); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); addr = ConvertPointToLocation(latitude, longitude); String temp_c = SendToUrl(addr); } } } 

Y agregue el método de permiso de usuario en su archivo de manifiesto

   

Prueba esto, esto no te dará una ubicación actual nula

 class GetLastLocation extends TimerTask { LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationListener mlocListenerTmp = new CustomLocationListener(); private final Handler mLocHandler; public GetLastLocation(Handler mLocHandler) { this.mLocHandler = mLocHandler; } @Override public void run() { timer.cancel(); mlocManager.removeUpdates(mlocListenerTmp); Location location = mlocManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); { if (mlocListenerTmp != null) { mlocManager.removeUpdates(mlocListenerTmp); } currentLocation = location; } if (location != null) { String message = String.format( "Location \n Longitude: %1$s \n Latitude: %2$s", location.getLongitude(), location.getLatitude()); Log.d("loc", " :" + message); Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", true); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } else { Log.d( "loc", ":No GPS or network signal please fill the location manually!"); location = mlocManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { currentLocation = location; Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", true); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } else { Bundle b = new Bundle(); { b.putBoolean("locationRetrieved", false); { Message msg = Message.obtain(); { msg.setData(b); mLocHandler.sendMessage(msg); } } } } } } } 

llámalo así

 timer.schedule(new GetLastLocation(mLocHandler), 3000); 

y la clase customLocation es la siguiente

 public class CustomLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { loc.getLatitude(); loc.getLongitude(); currentLocation = loc; String Text = "My current location is: " + "Latitud = " + loc.getLatitude() + "Longitud = " + loc.getLongitude(); Log.d("loc", "onLocationChanged" + Text); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} } 

Si lo estás probando en un dispositivo de malvavisco, intenta habilitar el permiso de ubicación para tu aplicación manualmente.

¿Has intentado revertir el código? Por ejemplo, si (ubicación == nulo), a continuación, imprima esa ubicación es nula, y si no la ubicación de impresión no es nula. Ya tuve el problema una vez y eso pareció haberlo solucionado (no sé por qué). Trata eso.

Si eso no funciona, tal vez la API de google maps devuelve el valor nulo, en cuyo caso es un problema con la API GM o con el método de llamada. Cualquiera de estos podría ser el problema.

Espero que esto ayude,

-JXP