getLastKnownLocation trả về null


83

Tôi đã đọc một số câu hỏi về điều này, nhưng tôi không hoàn toàn tìm thấy câu trả lời mà tôi cần.

Vì vậy, trường hợp là tôi đã thiết lập bản đồ và tôi muốn lấy vị trí gps hiện tại của mình. Tôi đã kiểm tra rằng các biến của tôi không phải là NULL nhưng kết quả của tôi từ:

getLastKnownLocation(provider, false);

Tuy nhiên, cung cấp cho tôi null, vì vậy đây là nơi tôi cần giúp đỡ. Tôi đã thêm quyền cho vị trí COARSE + FINE. Nhưng tôi thường bị vô hiệu hóa tất cả các loại dữ liệu mạng cho điện thoại của mình, vì tôi không hài lòng lắm về chi phí luồng dữ liệu không thể đoán trước trong hóa đơn điện thoại của mình. Vì vậy, tôi chỉ bật và kết nối WiFi cho thử nghiệm này.

Tôi CẦN bật thêm điều gì để có thể thực hiện được điều này? Tôi sẽ nghĩ rằng WiFi phải là đủ?


bạn đang trộn api mới và cũ cho getLastLocation theo này stackoverflow.com/a/48033659/4997704
Binesh Kumar

Câu trả lời này đáng đọc: stackoverflow.com/a/38794291/5319831
Mohd Naved

Câu trả lời:


194

Sử dụng phương pháp này để lấy vị trí đã biết cuối cùng:

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

1
Hóa ra tôi đã sửa tất cả, tôi chỉ nhận thấy một lỗi và tôi đã tìm ra giải pháp cho điều này. Tôi chưa đặt điện thoại của mình để cho phép Định vị Google cho GPS. Vì vậy, vâng. Thanks anyways =)
Aleksander Fimreite

1
Thực hiện tuyệt vời, rất linh hoạt. Cảm ơn!
AlexVPerl,

2
Hoạt động như một sự quyến rũ. Cảm ơn!
erol yeniaras

1
kích hoạt vị trí trong điện thoại.
TharakaNirmana

16
câu hỏi là về getLastKnownLocation returns null... mã này sẽ không thay đổi gì ... nếu đối với tất cả các nhà cung cấp mLocationManager.getLastKnownLocation (vì nó có thể trả về null) nó vẫn sẽ trả về null ... câu trả lời là ... xin lỗi bạn không thể tránh điều này ... nếu bạn thực sự muốn vị trí không sử dụng getLastKnownLocation
Selvin

32

bạn đang trộn API vị trí mới và cũ với nhau khi không nên.

để có được vị trí đã biết cuối cùng, tất cả những gì bạn phải làm là gọi

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

khi dịch vụ vị trí được kết nối.

đọc cách sử dụng API vị trí mới

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

4
Cảm ơn bạn đã chỉ ra rằng có API mới. Đây phải là câu trả lời được chấp nhận.
Violet Giraffe

cảm ơn bạn rất nhiều API này là nhanh hơn nhiều nhờ người đàn ông tôi đã không biết nó tồn tại
Kathy

1
Vị trí cũng trả về null ở đây. Nguyên nhân có thể là gì?
JollyRoger

1
kiểm tra sự cho phép của Vị trí
Binesh Kumar

Đồng ý ... đây phải là câu trả lời được chấp nhận. Cảm ơn bạn.
Nicola Salvaro

6

Bạn đang cố gắng lấy vị trí đã lưu trong bộ nhớ cache từ Nhà cung cấp mạng. Bạn phải đợi vài phút cho đến khi nhận được bản sửa lỗi hợp lệ. Vì bộ nhớ cache của Nhà cung cấp mạng trống nên rõ ràng là bạn đang nhận được giá trị rỗng ở đó ..


Được rồi, vậy tôi cần tạo bộ nhớ cache của mình? Làm cách nào để làm điều đó khi ứng dụng của tôi gặp sự cố vì điều này?
Aleksander Fimreite

1
bạn phải sử dụng phương thức onLocationChanged của trình nghe vị trí. Bắt một sửa chữa hợp lệ cần có thời gian (vài phút)
Sagar Maiyad

Được rồi, cám ơn. Tôi sẽ fiddle xung quanh cho đến khi tôi nhìn thấy nó popping một khúc gỗ =)
Aleksander Fimreite

3
Tôi có cần phải di chuyển xung quanh nó ngay cả khi nó không có gì được lưu trữ không?
Aleksander Fimreite

1

Thêm mã này

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

trước hàm:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) cũng như chức năng: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)


1

Hãy thử điều này nó hoạt động tốt cho tôi: -

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

Bạn có thể sử dụng NETWORK_PROVIDER thay cho GPS_PROVIDER để có kết quả nhanh hơn ..


0

Tôi gặp sự cố này trong Xamarin.Android.

Location location = locationManager.GetLastKnownLocation(provider);trả về giá trị null. Tôi đã kiểm tra mã của mình và biết rằng tôi vừa yêu cầu quyền cho ACCESS_COARSE_LOCATION. Tôi đã thêm mã để yêu cầu quyền cho ACCESS_FINE_LOCATION và bây giờ nó không trả về giá trị rỗng. Đây là mã của tôi:

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

Trong trường hợp bất kỳ ai đến từ Xamarin.Android (C #) sẽ thấy nó hữu ích. Đối với Java hoặc Android Studio mã sẽ withs tương tự một số nhỏ Cú pháp thay đổi như GetLastKnownLocation()sẽ getLastKnownLocation()như tên phương pháp trong Java bắt đầu với chữ thường trong khi trong C # tên phương pháp bắt đầu với chữ hoa.


0

Tôi thích giải pháp này để cập nhật vị trí:

Cập nhật vị trí

Trong sơ yếu lý lịch, hãy thêm điều kiện:

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

Và có thể là một số cơ bản, nhưng hãy kiểm tra xem GPS có BẬT không.


-4

Thay thế dòng của bạn bằng

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.