getLastKnownLocation이 null을 반환합니다.


84

이것에 대한 몇 가지 질문을 읽었지만 필요한 답을 찾지 못했습니다.

그래서, 제가지도를 설정했고 현재 GPS 위치를 파악하고 싶습니다. 내 변수가 NULL이 아닌지 확인했지만 결과는 다음과 같습니다.

getLastKnownLocation(provider, false);

그래도 null을 제공하므로 도움이 필요한 곳입니다. COARSE + FINE 위치에 대한 권한을 추가했습니다. 하지만 전화 요금에서 예측할 수없는 데이터 흐름 비용에 대해별로 만족스럽지 않기 때문에 일반적으로 전화에 대해 모든 종류의 네트워크 데이터를 비활성화합니다. 그래서이 테스트를 위해 WiFi 만 활성화하고 연결했습니다.

이것이 가능하기 위해 더 활성화해야 할 것이 있습니까? WiFi가 충분해야한다고 생각합니까?


이에 따라 getLastLocation을위한 새로운 API와 기존 혼합되어 stackoverflow.com/a/48033659/4997704
Binesh 쿠마

이 답변은 읽어 볼 가치가있다 : stackoverflow.com/a/38794291/5319831
흐드 Naved

답변:


194

이 방법을 사용하여 마지막으로 알려진 위치를 가져옵니다.

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
나는 그것을 모두 수정했다는 것이 밝혀졌고, 나는 이것에 대한 해결책을 찾았다는 오류를 발견했습니다. GPS 용 Google 위치를 허용하도록 휴대 전화를 설정하지 않았습니다. 그래. 감사합니다 어쨌든 =)
알렉산더 Fimreite

1
뛰어난 구현, 매우 유연합니다. 감사!
AlexVPerl

2
매력처럼 작동합니다. 감사!
erol yeniaras

1
전화에서 위치를 활성화하십시오.
TharakaNirmana

17
질문은 getLastKnownLocation returns null...이 코드는 아무것도 변경하지 않습니다 ... 모든 공급자에 대해 mLocationManager.getLastKnownLocation (null을 반환 할 수 있기 때문에) 여전히 null을 반환하면 ... 답은 ... 이것을 피할 수 없습니다 ... 정말 원한다면 위치는 getLastKnownLocation을 사용하지 않습니다.
Selvin

32

해야 할 때 새 위치 API와 이전 위치 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();
                }
            });
}

4
새로운 API가 있음을 알려 주셔서 감사합니다. 이것은 받아 들여진 대답이어야합니다.
Violet Giraffe

당신이 너무 많은이 API는 내가이 존재 훨씬 빠르게 덕분에 사람을 알고하지 않았다입니다 감사합니다
Tabish

1
위치도 여기에서 null을 반환합니다. 그 이유는 무엇일까요?
JollyRoger

1
위치 권한을 확인
Binesh 쿠마에게

동의합니다 ... 이것은 받아 들여진 대답이어야합니다. 감사합니다.
Nicola Salvaro

7

네트워크 공급자로부터 캐시 된 위치를 가져 오려고합니다. 올바른 수정을 얻을 때까지 몇 분 동안 기다려야합니다. 네트워크 공급자의 캐시가 비어 있으므로 분명히 null이 표시됩니다.


좋습니다. 캐시를 구축해야하나요? 이로 인해 내 앱이 충돌 할 때 어떻게해야합니까?
알렉산더 Fimreite

1
위치 수신기의 onLocationChanged 메서드를 사용해야합니다. 유효한 수정을 얻는 것은 시간 (몇 분) 소요
사가르 Maiyad

좋아, 고마워. 내가 =이 로그를 보여주고 볼 때까지 나는) 주변에 바이올린 것이다
알렉산더 Fimreite에게

3
아무것도 저장되어 있지 않아도 함께 이동해야합니까?
알렉산더 Fimreite

1

이 코드 추가

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)


1

이것을 시도해보십시오.

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

더 빠른 결과를 위해 GPS_PROVIDER 대신 NETWORK_PROVIDER를 사용할 수 있습니다.


0

Xamarin.Android에서이 문제가 발생했습니다.

Location location = locationManager.GetLastKnownLocation(provider);null 값을 반환했습니다. 코드를 확인한 결과 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 또는 안드로이드 스튜디오의 코드는 같은 구문이 변경 약간의 유사한 옆 널빤지 될 GetLastKnownLocation()것입니다 getLastKnownLocation()C에서 # 방법 이름은 대문자 문자로 시작하면서 자바에서 메소드 이름은 소문자로 시작한다.


0

이 솔루션이 위치를 업데이트하는 것이 마음에 들었습니다.

위치 업데이트

이력서에서 조건을 추가하십시오.

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가 켜져 있는지 확인하십시오.


-4

ur 줄을

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.