2012-03-26 30 views
14

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, intento 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?Mi ubicación actual siempre devuelve null. ¿Cómo puedo arreglar esto?

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(); 
} 
+0

Intenta acceder a los mapas de Google directamente, no desde la aplicación. ¿Funciona? ¿Te localizo? después de que se localiza, ¿se ejecuta el código como se esperaba?¿Pruebas en dispositivo o emulador? –

+0

Estoy probando en el emulador, estoy usando API nivel 15. No me localizará, siempre devuelve nulo. También intenté acceder a la aplicación google maps en el emulador, tampoco puedo encontrar la ubicación – devinefergal

+0

que está usando de manera incorrecta, siga esto https://stackoverflow.com/a/48033659/4997704 –

Respuesta

32

getLastKnownLocation() utiliza la ubicación (s) encontrado previamente por otras aplicaciones. si ninguna aplicación ha hecho esto, entonces 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 el mejor proveedor. por ejemplo,

private Location getLastKnownLocation() { 
    List<String> 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 hacer frente sin tener un lugar, y si no hay última ubicación conocida, que se necesitan para escuchar las actualizaciones de ubicación. puedes echar un vistazo a esta clase para un ejemplo,

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

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

+6

¿Por qué 'if (bestLocation == null) {return null ; } return bestLocation; 'y no solo' return bestLocation; '? Consulte también [aquí] (http://stackoverflow.com/questions/2250597/find-current-location-latitude-and-longitude#comment25840492_2251680) –

+0

NPE en el registro si la ubicación es nula –

+1

Gracias hombre. Me salvas mucho – philip

0

¿Has intentado invertir 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

7

si u encontrar la ubicación actual de los dispositivos de la utilización 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<String> 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 Agregar método de permisos de usuario en el archivo de manifiesto

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
+1

Esto es hermoso – stepheaw

0

probar este esto no lo hará darle lugar nulo actual

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); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

llaman como esto

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

y la customLocationclass es el 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) {} 
} 
+6

¿Por qué usa todos los frenillos adicionales? –

0

Si usted está tratando a cabo en un dispositivo de malvavisco, intente habilitar el permiso ubicación para su aplicación de forma manual.

Cuestiones relacionadas