developer tip

getLastKnownLocation이 null을 반환합니다.

optionbox 2020. 11. 3. 07:56
반응형

getLastKnownLocation이 null을 반환합니다.


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

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

getLastKnownLocation(provider, false);

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

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


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

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

해야 할 때 새로운 위치 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();
                }
            });
}

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


이것을 시도해보십시오.

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를 사용할 수 있습니다.


이 코드 추가

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)


ur 줄을

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

참고 URL : https://stackoverflow.com/questions/20438627/getlastknownlocation-returns-null

반응형