nueog

[Android Studio] Kakao Map API V2 적용 본문

Android Studio

[Android Studio] Kakao Map API V2 적용

nueog 2024. 4. 29. 17:49
반응형

기존 어플에 적용했던 카카오 지도를 v2 버전으로 업데이트 해야 해서 진행하였다!

 

https://apis.map.kakao.com/android_v2/docs/

 

위 게시물을 따라서 진행하였고 24년 6월에 기존 v1 지도가 지원종료를 한다는 공지에 1순위로 마이그레이션을 진행했다.

 

기존 v1 지도와 가장 크게 다른 점은 로딩속도인 것 같다.

현저히 !! 차이난다. 심지어 기존 v1지도에서는 로딩될 때 격자무늬로 깨지는데 v2에서는 그런 현상도 없는 것을 확인했다.

 

init 및 xml 레이아웃 적용방법은 기존 방식과 비슷하니 게시물을 잘 따라하면 된다.

 

v2 버전에서는 지도 객체에 라이프사이클이 생겼다!

 

map을 start 한 후에 callback함수로 destory, error, mapready 상태를 파악할 수 있다.

그리고 resume, onpause 등도 override 함수로 제공된다.

 

       //지도 세팅
        mapView = v.findViewById(R.id.map_view);
        mapView.start(new MapLifeCycleCallback() {

            @Override
            public void onMapDestroy() {
                // 지도 API 가 정상적으로 종료될 때 호출됨
                Log.d(getTag(), "destroy");
            }

            @Override
            public void onMapError(Exception error) {
                // 인증 실패 및 지도 사용 중 에러가 발생할 때 호출됨
                Log.d(getTag(), error.toString());
            }
        }, new KakaoMapReadyCallback() {
            @Override
            public void onMapReady(KakaoMap map) {
                // 인증 후 API 가 정상적으로 실행될 때 호출됨
                Log.d("", "onMapReady");

                kakaoMap = map;
                //클릭이벤트 활성화
                kakaoMap.setPoiClickable(true);

                setStore();

                kakaoMap.setOnLabelClickListener(new KakaoMap.OnLabelClickListener() {
                    //label 클릭 시 실행
                    @Override
                    public void onLabelClicked(KakaoMap kakaoMap, LabelLayer layer, Label label) {

                        //polyline 초기화
                        if (robotRouteLine != null)
                            kakaoMap.getRouteLineManager().remove(robotRouteLine);
                        String Tag = "", Key = "";
                        try {
                            Tag = label.getTag().toString();
                            Key = label.getTexts()[0];
                        } catch (Exception e) {
                            Log.d("clickevent", e.toString());
                        }

                        if (Tag.equals(ROBOT_TAG)) { //로봇 선택: dialog 켜기
                            robotInfo = robotHash.get(Key);

                            infoLayout.setVisibility(View.VISIBLE);
                            robotBattBG.setVisibility(View.VISIBLE);
                            infoIcon.setImageResource(R.drawable.icon_robot_list);
                            infoName.setText(robotInfo.getRbSerial());
                            infoETC.setText("정비일: " + robotInfo.getRbManuDate());

                            infoDistance.setText(Distance.distance_string(GPSLocationManager.getLatitude(), GPSLocationManager.getLongitude(), Double.parseDouble(robotInfo.getLatitude()), Double.parseDouble(robotInfo.getLongitude())));

                            try {
                                switch (robotInfo.getRbState()) {
                                    case "002":
                                        infoState.setText("점포 이동 중");
                                        break;
                                    case "003":
                                        infoState.setText("배달 중");
                                        break;
                                    case "004":
                                        infoState.setText("정비 중");
                                        break;
                                    case "005":
                                        infoState.setText("운행 중단");
                                        break;
                                    case "006":
                                        infoState.setText("충전 중");
                                        break;
                                    case "007":
                                        infoState.setText("수동 제어");
                                        break;
                                    default:
                                        infoState.setText("정상 운행");
                                        break;
                                }
                            } catch (NullPointerException e) {
                                infoState.setText("정상 운행");
                            }

                            rb_code = robotInfo.getRbCode();
                            st_code = null;
                            updatePolyline();
                        } else if (Tag.equals(STORE_TAG)) { //점포 선택: dialog 켜기
                            storeInfo = storeHash.get(Key);

                            infoLayout.setVisibility(View.VISIBLE);
                            robotBattBG.setVisibility(View.GONE);
                            infoIcon.setImageResource(R.drawable.ic_store_gray);
                            infoName.setText(storeInfo.getSt_name());
                            infoETC.setText("영업 시간: "+storeInfo.getSt_open() + " ~ " + storeInfo.getSt_close());
                            if (storeInfo.getSt_state().equals("A"))
                                infoState.setText("영업 중");
                            else if (storeInfo.getSt_state().equals("B"))
                                infoState.setText(storeInfo.getSt_open() + " 오픈");
                            else if (storeInfo.getSt_state().equals("C"))
                                infoState.setText("영업 마감");
                            else if (storeInfo.getSt_state().equals("D"))
                                infoState.setText("점포 휴무");
                            else
                                infoState.setText("영업 준비 중");
                            infoDistance.setText(Distance.distance_string(GPSLocationManager.getLatitude(), GPSLocationManager.getLongitude(), Double.parseDouble(storeInfo.getSt_latitude()), Double.parseDouble(storeInfo.getSt_longitude())));

                            rb_code = null;
                            st_code = storeInfo.getSt_code();
                        }
                    }
                });
            }

            @Override
            public LatLng getPosition() {
                // 지도 시작 시 위치 좌표를 설정
                return LatLng.from(GPSLocationManager.getLatitude(), GPSLocationManager.getLongitude());
            }

            @Override
            public int getZoomLevel() {
                // 지도 시작 시 확대/축소 줌 레벨 설정
                return 15;
            }

            @Override
            public String getViewName() {
                // KakaoMap 의 고유한 이름을 설정
                return "MyFirstMap";
            }

            @Override
            public boolean isVisible() {
                // 지도 시작 시 visible 여부를 설정
                return true;
            }

            @Override
            public String getTag() {
                // KakaoMap 의 tag 을 설정
                return "FirstMapTag";
            }
        });

 

반응형