네이버지도 관련 질문드립니다.

조회수 1822회
private final NMapLocationManager.OnLocationChangeListener onMyLocationChangeListener = new NMapLocationManager.OnLocationChangeListener() {

        @Override
        public boolean onLocationChanged(NMapLocationManager locationManager, NGeoPoint myLocation) {

            if (mMapController != null) {
                mMapController.animateTo(myLocation);
            }
            Log.d("myLog", "myLocation  lat " + myLocation.getLatitude());
            Log.d("myLog", "myLocation  lng " + myLocation.getLongitude());


            findPlacemarkAtLocation(myLocation.getLongitude(), myLocation.getLatitude());
            //위도경도를 주소로 변환
            return true;
        }

현재 네이버지도API를 통해 현재위치를 마커를통해 검색하게는 구현을 해놓은 상태입니다. 하지만 지도화면에서 뒤로가기버튼을 누르면 바로 어플이 중지됩니다.

아래는 에러화면입니다.

FATAL EXCEPTION: main Process: com.kim.bisos, PID: 19493 java.lang.IllegalStateException: findPlacemarkAtLocation() could not be invoked prior to setMapDataProviderListener(). at com.nhn.android.maps.NMapContext.findPlacemarkAtLocation(NMapContext.java) at com.nhn.android.maps.NMapActivity.findPlacemarkAtLocation(NMapActivity.java) at `

`com.kim.bisos.NaverMyLocation$2.onLocationChanged(NaverMyLocation.java:180)

com.nhn.android.maps.NMapLocationManager.onLocationChanged(NMapLocationManager.java) at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:281) at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:210) at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:226) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5951) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

'''

진한색으로 표시된부분이 에러를 말하는 것같습니다. 도움 주시면 정말 감사하겠습니다.

1 답변

  • 에러 내용은 findPlacemarkAtLocation() 함수를 호출하기 전에 setMapDataProviderListener(OnDataProviderListener listener)를 먼저 호출해야 한다.라는 제약사항을 어겼기 때문에 발생하는 익셉션입니다.

    만일 일반적인 케이스에서는 정상동작하는데 뒤로가기 시에만 발생하는 것이라면 액티비티의 라이프사이클이 종료되는 시점에 MapDataProviderListener가 내부적으로 해지되고 난 후 onLocationChanged() 콜백이 호출됐기 때문이 아닐까 추측되고요.

    해결 방법 중 하나는 뒤로가기 시점에 setOnLocationChangeListner(null)로 설정을 해서 onLocationChanged() 콜백이 더 이상 호출되지 않도록 처리하면 될 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 안녕하세요 .알려주신대로 setOnLocationChangeListner(onMyLocationChangeListener)에서 setOnLocationChangeListner(null) 로 null값을 추가하여 주었는데 똑같은 에러가 나옵니다. 김민제 2016.10.1 15:13
    • 어떤 함수에서 setOnLocationChangeListner(null)로 설정했는지 알 수 있을까요? 알 수 없는 사용자 2016.10.1 23:04
    • 네이버 API가이드안에있는 NaverMyLocation 자바파일에서 OnCreate 바로 안에 속해있는 //location manager부분 mMapLocationManager = new NMapLocationManager(this); mMapLocationManager.setOnLocationChangeListener(onMyLocationChangeListener); 여기에서 괄호부분오른쪽함수 onMyLocationChangeListener 부분을 null값을 주었습니다. 김민제 2016.10.2 11:36
    • setOnLocationChangeListner(null)을 액티비티의 onBackPressed() 또는 onDestroy() 함수에 넣어보세요. 알 수 없는 사용자 2016.10.3 22:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)