Подтвердить что ты не робот

GetLastKnownLocation возвращает NULL

Я только что получил это, но когда я выключил свой Wi-Fi, чтобы узнать, могу ли я получить более точное местоположение с помощью своего GPS, теперь он приносит мне ошибку NullPointer, и я не понимаю, почему.

Следующий код вызывается первым;

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

Что тогда влечет за собой этот метод, называемый

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

Вы можете видеть, что у меня есть 2 тоста, и они вернулись с фактическими координатами GPS, но когда я вызываю код ниже, он вылетает на новой строке местоположения 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;
        }
    }

Я просто не понимаю, почему, когда я пытаюсь найти местоположение, которое, похоже, было найдено в методе onLocationChanged, оно просто имеет нулевой указатель.

4b9b3361

Ответ 1

вы смешиваете новый и старый API местоположения вместе, когда не хотите.

чтобы получить последнее известное местоположение, все, что вам нужно сделать, это позвонить

mLocationClient.getLastLocation();

после подключения службы определения местоположения.

прочитайте, как использовать новый API местоположения

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

Ответ 2

Я просто изменил

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

Это решило решение для меня. Полный фрагмент:

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

Надеюсь, это поможет.

Ответ 3

Я долго боролся с этим. Но Google только придумал решение.

googleMap.getMyLocation();

чтобы получить местоположение синей точки на api V2.

Ответ 4

попробуйте этот код:

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