GetLastKnownLocation возвращает null
Я прочитал некоторые вопросы об этом, но я не нашел ответа, который мне нужен.
Итак, дело в том, что у меня установлена моя карта, и я хочу захватить текущее местоположение gps.
Я проверил, что мои переменные не являются NULL, но все же мой результат:
getLastKnownLocation(provider, false);
Дает мне значение null, поэтому мне нужна помощь.
Я добавил разрешения для местоположения COARSE + FINE. Но у меня обычно отключены все виды сетевых данных для моего телефона, потому что я не очень доволен непредсказуемыми расходами на поток данных в своем телефонном счете. Поэтому для этого теста у меня включен только WiFi и подключен.
Есть ли еще что-то, что мне нужно, чтобы это было возможно? Я думаю, WiFi должен быть достаточным?
Ответы
Ответ 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);