0

사용자 위치를 새로 고치려고 시도했습니다.Android - 활동 시작시 사용자 위치를 새로 고침 할 수 없습니다.

내 앱에서 사용자의 현재 위치를 표시하는지도를 시작하지만 locationManager.getLastKnownLocation()은 캐시 위치를 사용하므로 다른 위치 인 을 반환합니다.

콜백 OnMapReady에서지도상의 정확한 위치를 표시 할 수 있도록 마지막으로 알려진 위치를 현재 위치와 어떻게 비교할 수 있습니까?

StackOverflow에서 발견 된 모든 예제는 LocationListener.onLocationChanged() 메서드를 사용하지만 작업 시작시 위치를 새로 고쳐야합니다 (필요한 경우).

코드 :

private static final String TAG_MAP_LOAD_FAILED = "FAIL LOADING MAP STYLE"; 
private static final String TAG_MAP_PARSING_FAILED = "FAIL PARSING MAP STYLE"; 

private GoogleMap mMap; 
private LatLng mMyCoordinates; 
private LocationManager mLocationManager; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mLocationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); 
    getMapAsync(this); 
} 



@Override 
public void onMapReady(GoogleMap googleMap) { 

    mMap = googleMap; 

    try{ 
     boolean success = googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.style_mapjson)); 

     if(!success){ 
      Log.e(TAG_MAP_PARSING_FAILED, "Failed parsing JSON Style"); 
     } 

    }catch (Resources.NotFoundException ex){ 
     Log.e(TAG_MAP_LOAD_FAILED, "Can't find style. Error:", ex); 
    } 


    mMap.setIndoorEnabled(false); 

    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(mMyCoordinates); 
    markerOptions.title("Marker in my location"); 
    mMap.addMarker(markerOptions); 

    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMyCoordinates, 15); 
    mMap.moveCamera(cameraUpdate); 
    mMap.getUiSettings().setRotateGesturesEnabled(false); 

} 

@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) { 

} 

OBS : 그것은 실패한 시도의 전체지고 있었기 때문에 내가 코드를 정리. 그것이 어떻게 구조화되어 있는지 보여 주기만하면됩니다.

대신 FusedLocation을 사용해야합니까?

+0

예. 'LocationManager'는 다른 구현물을 사용합니다. 연결 콜백을 얻기 위해'GoogleMap'과 함께 사용할 수 있다고 생각지 않습니다. 그 아이디어는 어디에서 얻었습니까? 이를 위해 API 클라이언트가 필요합니다. [공식 문서] (https://developers.google.com/maps/documentation/android-api/start)가 아닌 SO에서 가장 먼저 답변을 찾는 이유는 다른 포럼의 문제입니다. 끝까지 읽기를 시도하면 해결할 수 있습니다. 그리고 네, 사용 중지 된 코드를 사용하지 않는 한'FusedLocation'을 사용하십시오 – Chisko

답변

1

마지막으로 알려진 위치에는 타임 스탬프가 연결되어 있으며, 과거에는 꽤 시간이 걸릴 수 있습니다. 마지막으로 알려진 위치의 타임 스탬프와 나이 비교를 허용하고 필요한 경우 업데이트를 요청하십시오. 당신은 위치를 요청하지 않으

private static long MAX_TIME = 60 * 60 * 1000; //Update if location is older than one hour 

@Override 
public void onResume() { 
    super.onResume(); 
    Location location = mLocationManager.getLastKnownLocation(YOUR_PROVIDER_HERE); //GPS or Network 

    boolean shouldUpdateLocation = false; 
    if (location != null) { 
     long elapsedTime = System.currentTimeMillis() - location.getTime(); 
     if (elapsedTime >= MAX_TIME) { 
      shouldUpdateLocation = true; 
     } 
    } 
    else { 
     shouldUpdateLocation = true; 
    } 

    if (shouldUpdateLocation) { 
     //TODO: Request location update here. 
    } 
} 

활동이 제기 될 때마다 업데이트, 그래서 이것에 대한 합리적인 MAX_TIME을 설정 : 여기에 신속하고 더러운 예입니다.

+0

감사합니다, Pablo. 한가지 더 질문 : 새로 고친 위치를 가져 오기 위해'requestSingleUpdate()'를 사용해야합니까? –

+0

'requestLocationUpdates()'를 사용하고 정 위치를 얻으면 멈출 수 있습니다. –

+0

이것이 해결책인지 시험해보고 질문을 업데이트 할 것입니다! 감사! –