web-dev-qa-db-fra.com

getLastKnownLocation renvoie NULL

Je venais tout juste de faire fonctionner ce système, mais lorsque j'ai désactivé mon accès Wi-Fi pour savoir si je pouvais obtenir un emplacement plus précis à l'aide de mon GPS, cela m'apporte maintenant une erreur NullPointer et je ne vois pas pourquoi.

Le code ci-dessous est appelé en premier.

 public void onConnected(Bundle dataBundle) {
        connected = true;
        //Request an update from the location client to get current Location details
        mLocationClient.requestLocationUpdates(mLocationRequest,this);
        Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
    }

Ce qui implique alors que cette méthode soit appelée

public void onLocationChanged(Android.location.Location location) {
        // Report to the UI that the location was updated
        String msg = "Updated Location: " +
                Double.toString(location.getLatitude()) + "," +
                Double.toString(location.getLongitude());
        if(tmp != location.getLatitude())
        {
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
        tmp = location.getLatitude();
    }

Vous pouvez voir que j'ai 2 toasts là-bas et qu'ils reviennent très bien avec les coordonnées GPS réelles, mais lorsque j'appelle le code ci-dessous, il tombe en panne sur la nouvelle ligne de localisation getLastKnownLocation

public String getLocation()
    {
        // Get the location manager
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        String bestProvider = locationManager.getBestProvider(criteria, false);
        Android.location.Location location = locationManager.getLastKnownLocation(bestProvider);
        Double lat,lon;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        try {
            lat = location.getLatitude ();
            lon = location.getLongitude ();
            Toast.makeText(this,""+lat.toString()+"-"+lon.toString(),Toast.LENGTH_SHORT).show();
            return new LatLng(lat, lon).toString();
        }
        catch (NullPointerException e){
            Toast.makeText(this,"HELL-NO",Toast.LENGTH_SHORT).show();
            Log.e("HELL-NO","n",e);
            e.printStackTrace();
            return null;
        }
    }

Je ne comprends tout simplement pas pourquoi, lorsque j'essaie de récupérer l'emplacement, qui semble avoir été récupéré dans la méthode onLocationChanged, il génère un nullpointer.

15
r0bb077

vous mélangez les API de nouvel et ancien emplacement quand vous ne devriez pas.

pour obtenir le dernier emplacement connu, il vous suffit d'appeler 

mLocationClient.getLastLocation();

une fois le service de localisation connecté.

lisez comment utiliser la nouvelle API d'emplacement

http://developer.Android.com/training/location/retrieve-current.html#GetLocation

7
tyczj

J'ai simplement changé 

locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) to 
locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

Cela a résolu la solution pour moi. Extrait complet:

map  = ((MapFragment) getFragmentManager().
            findFragmentById(R.id.map)).getMap();

    map.setMyLocationEnabled(true);

    locationManager = (LocationManager)getSystemService
            (Context.LOCATION_SERVICE); 
    getLastLocation = locationManager.getLastKnownLocation
            (LocationManager.PASSIVE_PROVIDER);
    currentLongitude = getLastLocation.getLongitude();
    currentLatitude = getLastLocation.getLatitude();

    currentLocation = new LatLng(currentLatitude, currentLongitude); 

J'espère que cela t'aides. 

29
Troy Zuroske

essayez ce code:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}
0
Khalid Taha

J'ai lutté avec celui-ci pendant un long moment. Mais Google vient de proposer une solution. 

googleMap.getMyLocation();

pour obtenir l'emplacement du point bleu sur api V2.

0
The_Martian