2012-03-26 52 views
14

Próbuję znaleźć moją bieżącą lokalizację dla projektu Android. Po załadowaniu aplikacji moja bieżąca lokalizacja jest zawsze pusta. Ustawiłem uprawnienia w manifeście itp. Kiedy znajduję bieżącą lokalizację, zamierzam użyć współrzędnych, aby znaleźć odległości do innych lokalizacji na mapie. Mój fragment kodu znajduje się poniżej. Dlaczego zawsze otrzymuję wartość zerową?Moja aktualna lokalizacja zawsze zwraca wartość null. Jak mogę to naprawić?

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

Spróbuj uzyskać dostęp do map google bezpośrednio z poziomu aplikacji. Czy to działa - zlokalizować ciebie? po jego zlokalizowaniu uruchamiasz swój kod zgodnie z oczekiwaniami?Czy testujesz na urządzeniu lub emulatorze? –

+0

Testuję na emulatorze, używam API poziomu 15. Nie odnajdzie mnie, zawsze zwróci wartość null. Próbowałem również uzyskać dostęp do aplikacji map Google na emulatorze, ale także nie można znaleźć lokalizacji – devinefergal

+0

używasz nieprawidłowego sposobu postępuj zgodnie z tym https://stackoverflow.com/a/48033659/4997704 –

Odpowiedz

32

getLastKnownLocation() wykorzystuje lokalizację (y) wcześniej przez inne aplikacje. jeśli żadna aplikacja tego nie zrobi, wtedy getLastKnownLocation() zwróci wartość null.

Jedna rzecz, którą możesz zrobić dla swojego kodu, aby mieć większą szansę na zdobycie ostatniej znanej lokalizacji dla wszystkich aktywnych dostawców, a nie tylko dla najlepszego dostawcy. na przykład

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

jeśli aplikacja nie może poradzić sobie bez lokalizację, a jeśli nie ma ostatniej znanej lokalizacji, trzeba będzie słuchać aktualizacje lokalizacji. można przyjrzeć się tej klasie na przykład

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

patrz metoda onStartCommand(), gdzie sprawdza, czy usługodawca sieciowy jest włączony. jeśli nie, używa ostatniej znanej lokalizacji. jeśli jest włączony, rejestruje się, aby otrzymywać aktualizacje lokalizacji.

+6

Dlaczego 'if (bestLocation == null) {return null ; } return bestLocation; 'a nie tylko' return bestLocation; '? Zobacz także [tutaj] (http://stackoverflow.com/questions/2250597/find-current-location-latitude-i-longitude#comment25840492_2251680) –

+0

NPE w dzienniku, jeśli lokalizacja jest pusta –

+1

Dzięki człowieku. Dużo mnie oszczędzasz. – philip

0

Czy próbowałeś cofnąć kod? Na przykład, jeśli (lokalizacja == null), wydrukuj tę lokalizację, która jest pusta, a lokalizacja wydruku nie jest pusta. Mam ten problem raz i to chyba naprawiło (nie wiem dlaczego). Spróbuj tego.

Jeśli to nie działa, być może Google Maps API zwraca wartość zerową, w takim przypadku jest to problem z GM-API lub z metodą połączenia. Każdy z tych problemów może stanowić problem.

Nadzieja to pomaga,

-JXP

7

jeśli u znaleźć bieżącą lokalizację urządzeń zastosowanie następujące metody w głównej klasy

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

I Dodaj metodę uprawnienia użytkownika w pliku manifestu

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

To jest piękne – stepheaw

0

Spróbuj to nie będzie to podasz bieżącą pustą lokalizację:

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

nazwać jak ten

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

i customLocationclass jest następujący

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

Dlaczego używasz wszystkich dodatkowych szelek? –

0

Jeśli próbujesz go w urządzeniu prawoślazu, spróbuj włączyć pozwolenie lokalizacji dla aplikacji ręcznie.

Powiązane problemy