2012-03-26 8 views
14

Ich versuche meinen aktuellen Standort für ein Android-Projekt zu finden. Wenn die Anwendung geladen ist, ist mein aktueller Standort immer null. Ich habe die Berechtigungen im Manifest usw. eingerichtet. Wenn ich den aktuellen Standort finde, beabsichtige ich, die Koordinaten zu verwenden, um Entfernungen zu anderen Orten auf der Karte zu finden. Mein Codeausschnitt ist unten. Warum bekomme ich immer einen Nullwert?Mein aktueller Standort gibt immer null zurück. Wie kann ich das beheben?

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

Versuchen Sie, Google Maps nicht direkt aus der App zuzugreifen. Funktioniert es - lokalisieren Sie? Nachdem der Code gefunden wurde, wird er wie erwartet ausgeführt.Testen Sie auf Gerät oder Emulator? –

+0

Ich teste auf dem Emulator, ich benutze API-Ebene 15. Es wird mich nicht finden, gibt immer null zurück. Ich habe auch versucht, Google Maps-Anwendung auf dem Emulator zugreifen, es kann auch nicht finden Ort – devinefergal

+0

Sie verwenden falsche Art und Weise folgen Sie diesem https://Stackoverflow.com/a/48033659/4997704 –

Antwort

32

getLastKnownLocation() den Standort verwendet (s), die zuvor von anderen Anwendungen gefunden. wenn keine Anwendung dies getan hat, gibt getLastKnownLocation() null zurück.

Eine Sache, die Sie mit Ihrem Code tun können, um eine bessere Chance zu bekommen, als letzte bekannte Position-Iterate über alle der aktivierten Anbieter, nicht nur der beste Anbieter. zum Beispiel kann

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

wenn Ihre Anwendung befasst sich nicht, einen Ort ohne und wenn es keine letzte bekannte Position ist, müssen Sie für den Standort-Updates hören. Sie können für ein Beispiel in dieser Klasse einen Blick darauf werfen,

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

siehe Methode onStartCommand(), wo es überprüft, ob der Netzbetreiber aktiviert ist. wenn nicht, verwendet es den letzten bekannten Ort. Wenn es aktiviert ist, registriert es sich für den Empfang von Standortaktualisierungen.

+6

Warum 'if (bestLocation == null) {null zurückgeben ; } return bestLocation; 'und nicht nur' return bestLocation; '? Siehe auch [hier] (http://stackoverflow.com/questions/2250597/find-current-location-latitude-and-longitude#comment25840492_2251680) –

+0

NPE auf Protokoll, wenn die Position Null ist –

+1

Danke Mann. Du rettest mich sehr. – philip

0

Haben Sie versucht, den Code umzukehren? Zum Beispiel, wenn (location == null), dann drucke diese Stelle null, und der Druckort ist nicht null. Ich hatte dieses Problem schon einmal und das schien es behoben zu haben (ich weiß nicht warum). Versuch das.

Wenn das nicht funktioniert, gibt die Google Maps-API möglicherweise den Nullwert zurück, in diesem Fall ist es ein Problem mit der GM-API oder mit der Aufrufmethode. Irgendwelche von diesen könnten das Problem sein.

hoffte, das hilft,

-JXP

7

wenn u aktuellen Standort von Geräten die Verwendung folgender Methode in Hauptklasse

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

und Add-Benutzerberechtigung Methode in der Manifest-Datei

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

Das ist schön – stepheaw

0

Versuchen Sie, diese dies wird nicht gefunden geben Sie null aktuellen Standort

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

nennen es wie dieses

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

und die customLocationclass ist als

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

Warum verwenden Sie alle zusätzlichen Klammern? –

0

folgt Wenn Sie es heraus in einem Marshmallow-Gerät versuchen, versuchen, manuell für Ihre Anwendung ermöglicht Standort Erlaubnis.