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

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

Я прочитал некоторые вопросы об этом, но я не нашел ответа, который мне нужен.

Итак, дело в том, что у меня установлена ​​моя карта, и я хочу захватить текущее местоположение gps. Я проверил, что мои переменные не являются NULL, но все же мой результат:

getLastKnownLocation(provider, false);

Дает мне значение null, поэтому мне нужна помощь. Я добавил разрешения для местоположения COARSE + FINE. Но у меня обычно отключены все виды сетевых данных для моего телефона, потому что я не очень доволен непредсказуемыми расходами на поток данных в своем телефонном счете. Поэтому для этого теста у меня включен только WiFi и подключен.

Есть ли еще что-то, что мне нужно, чтобы это было возможно? Я думаю, WiFi должен быть достаточным?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();

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

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

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

 private void getLastLocationNewMethod(){
    FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // GPS location can be null if GPS is switched off
                    if (location != null) {
                        getAddress(location);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("MapDemoActivity", "Error trying to get last GPS location");
                    e.printStackTrace();
                }
            });
}

Ответ 3

Вы пытаетесь получить кэшированное местоположение от поставщика сети. Вы должны подождать несколько минут, пока не получите правильное решение. Поскольку кеш сетевого провайдера пуст, вы, очевидно, получаете нуль.

Ответ 4

Попробуйте это, это работает хорошо для меня: -

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

        private Location getLastKnownLocation() {
            Location oldLoc;
            while (true){
                oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (oldLoc == null){
                    continue;
                }
                else {
                    break;
                }
            }
            return oldLoc;
        }

Вы можете использовать NETWORK_PROVIDER вместо GPS_PROVIDER для более быстрых результатов.

Ответ 5

Добавьте этот код

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

перед функция:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) а также функцию: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

Ответ 6

не стесняйтесь использовать мой простой класс, и он работает как шарм, и вы можете разработать его для сложных проектов GPS

public class GPS extends LocationListner{  

   Context mContext;
    boolean isGPSEnabled;
   boolean canGetLocation;
   boolean isPassiveEnabled;
   boolean isNetworkEnabled;
   Location location;
   LocationManager locationManager;

  public GPS(Context c) {

    this.mContext = c;


}


public Location getLocation() {
    int MIN_TIME_BW_UPDATES = 10000;
    int MIN_DISTANCE_CHANGE_FOR_UPDATES = 10000;
    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(mContext, "PLZ open up GPS To Access", Toast.LENGTH_SHORT).show();
        return null;
    }
    try {
        locationManager = (LocationManager) getApplicationContext()
                .getSystemService(LOCATION_SERVICE);

        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        isPassiveEnabled = locationManager
                .isProviderEnabled(LocationManager.PASSIVE_PROVIDER);

        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (isGPSEnabled || isNetworkEnabled || isPassiveEnabled) {

            this.canGetLocation = true;
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled && location == null) {
                locationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("GPS", "GPS Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                }
            }
            if (isPassiveEnabled && location == null) {
                locationManager.requestLocationUpdates(
                        LocationManager.PASSIVE_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
                }
            }

            if (isNetworkEnabled && location == null) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                }
            }

        } else {
            return null;
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return location;
}


@Override
public void onLocationChanged(Location location) {

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

}

Ответ 7

У меня была эта проблема в Xamarin. Android.

Location location = locationManager.GetLastKnownLocation(provider); возвращал нулевое значение. Я проверил свой код и узнал, что я только что запросил разрешение на ACCESS_COARSE_LOCATION. Я добавил код для запроса разрешения для ACCESS_FINE_LOCATION, и теперь он не возвращал значение NULL. Вот мой код:

void AskPermissions()
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
        RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    else
        GetLocation();
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
        GetLocation();
    else
        Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}

void GetLocation()
{
    locationManager = (LocationManager)GetSystemService(LocationService);
    provider = locationManager.GetBestProvider(new Criteria(), false);
    Location location = locationManager.GetLastKnownLocation(provider);
    if (location != null)
        Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
    else
        Log.Info(tag, "Location is null");
}

На случай, если кто-нибудь из Xamarin.Android (С#) сочтет это полезным. Для Java или Android Studio код будет аналогичным с некоторыми незначительными изменениями синтаксиса, такими как GetLastKnownLocation() будет getLastKnownLocation(), поскольку имена методов в Java начинаются со строчных букв, а в именах методов С# начинаются с заглавных букв.

Ответ 8

Замените строку ur с помощью

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);