Я читал несколько вопросов по этому поводу, но не нашел нужного ответа.
Итак, дело в том, что у меня настроена карта, и я хочу получить свое текущее местоположение по GPS. Я проверил, что мои переменные не равны NULL, но все же мой результат:
getLastKnownLocation(provider, false);
Но дает мне null, так что здесь мне нужна помощь. Я добавил разрешения для местоположения COARSE + FINE. Но у меня обычно отключены все виды сетевых данных для моего телефона, потому что я не очень доволен непредсказуемыми расходами на поток данных в моем счете за телефон. Поэтому для этого теста у меня был включен и подключен только Wi-Fi.
Есть ли что-то еще, что мне НЕОБХОДИМО включить, чтобы это стало возможным? Я думаю, Wi-Fi должно хватить?
android
google-maps
location
Александр Фимрейте
источник
источник
Ответы:
Используйте этот метод, чтобы получить последнее известное местоположение:
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; }
источник
getLastKnownLocation returns null
... этот код ничего не изменит ... если для всех поставщиковmLocationManager.getLastKnownLocation
(поскольку он может возвращать null) он все равно будет возвращать null ... ответ ... извините, вы не можете этого избежать ... если вы действительно хотите местоположение не используется getLastKnownLocationвы смешиваете вместе новый и старый 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(); } }); }
источник
Вы пытаетесь получить кэшированное местоположение от сетевого провайдера. Вы должны подождать несколько минут, пока не получите действительное исправление. Поскольку кеш сетевого провайдера пуст, вы, очевидно, получаете там ноль.
источник
Добавьте этот код
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)
источник
Попробуйте, это работает для меня: -
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 для более быстрых результатов.
источник
У меня была эта проблема в 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 (C #) сочтет это полезным. Для Java или Android Studio код будет аналогичным с некоторыми незначительными изменениями синтаксиса, например
GetLastKnownLocation()
,getLastKnownLocation()
имена методов в Java начинаются с строчных букв, а в C # имена методов начинаются с прописных букв.источник
Мне понравилось это решение для обновления местоположения:
Обновить местоположение
В резюме добавьте условие:
Location myLocation = getLastKnownLocation(); if (myLocation == null) { locationManager.requestLocationUpdates( LocationManager.PASSIVE_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS", "GPS Enabled"); }
И, возможно, некоторые базовые, но убедитесь, что GPS включен.
источник
Замените строку ur на
источник