본문 바로가기
Android

[안드로이드] Android(Kotlin) 환경에서 지도앱으로 길찾기 연동하기(NaverMap, KakakoMap, T-Map)

by JongSeok 2023. 10. 30.

개발 중인 Android 앱에 인앱에서 지도를 띄워주는 것이 아니라 외부 앱(네이버지도, 카카오맵, 티맵)으로 이동해 출발지와 도착지를 기준으로 길찾기를 바로 수행하는 기능을 구현하던 중 레퍼런스가 많이 부족하다고 느껴 한 번에 정리해두려 합니다.

 

이동하려는 앱의 설치 여부를 확인하고자 Intent와 URL Scheme을 이용합니다.

대부분 비슷한 방식으로 호출할 수 있지만 호출하는 URL 필드에 조금씩 다른 부분이 있습니다.


URL Scheme을 통해 외부앱으로 길찾기 기능을 실행한 화면
하단의 코드에서 사용되는 위도와 경도

1. 네이버지도 (NaverMap)

private fun searchLoadToNaverMap() {
    // 위도, 경도를 주소로 변환
    val geocoder = Geocoder(requireContext(), Locale.KOREAN)
    val startLocationAddress = geocoder.getFromLocation(startLocation.first, startLocation.second, 1)
    val endLocationAddress = geocoder.getFromLocation(endLocation.first, endLocation.second, 1)
    val encodedStartAddress = encodeAddress(startLocationAddress?.get(0)?.getAddressLine(0).toString().replace("대한민국 ",""))
    val encodedEndAddress = encodeAddress(endLocationAddress?.get(0)?.getAddressLine(0).toString().replace("대한민국 ",""))

    val url = "nmap://route/walk?slat=${startLocation.first}&slng=${startLocation.second}&sname=${encodedStartAddress}&dlat=${endLocation.first}&dlng=${endLocation.second}&dname=${encodedEndAddress}"

    val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url))
    intent.addCategory(Intent.CATEGORY_BROWSABLE)

    val installCheck = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())
        )
    } else {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.GET_META_DATA
        )
    }

    // 네이버맵이 설치되어 있다면 앱으로 연결, 설치되어 있지 않다면 스토어로 이동
    if (installCheck.isEmpty()) {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.nhn.android.nmap")))
    } else {
        startActivity(intent)
    }
}

네이버 지도에서 URL에 출발지와 도착지를 지정하는 방법은 slat/slng에 출발지의 위도/경도 dlat, dlng에 도착지의 위도/경도를 설정합니다.

그리고 어떤 이유에선지 API 공식문서와는 다르게 출발지, 도착지의 주소명을 설정하지 않으면 공식문서에서 기본값으로 지정된 주소명이 네이버지도로 이동한 후에 표시되지 않아 위도와 경도를 Geocoder 라이브러리로 주소명으로 변환해 인코딩된 문자열을 sname과 dname에 추가해 주었습니다. 

 

2. 카카오맵 (KakaoMap)

private fun searchLoadToKakaoMap() {
    val url ="kakaomap://route?sp=${startLocation.first},${startLocation.second}&ep=${endLocation.first},${endLocation.second}&by=FOOT"

    val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url))
    intent.addCategory(Intent.CATEGORY_BROWSABLE)

    val installCheck = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())
        )
    } else {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.GET_META_DATA
        )
    }

    // 카카오맵이 설치되어 있다면 앱으로 연결, 설치되어 있지 않다면 스토어로 이동
    if (installCheck.isEmpty()) {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=net.daum.android.map")))
    } else {
        startActivity(intent)
    }
}

카카오맵은 API 공식문서도 워낙 잘 되어 있었고, 참고할 레퍼런스도 많아 큰 어려움은 없었습니다. 신경 써야 할 특별한 부분도 딱히 없어 보이네요.

 

3. 티맵 (T-Map)

private fun searchLoadToTMap() {
    val url = "tmap://route?startx=${startLocation.second}&starty=${startLocation.first}&goalx=${endLocation.second}&goaly=${endLocation.first}&reqCoordType=WGS84&resCoordType=WGS84"

    val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url))
    intent.addCategory(Intent.CATEGORY_BROWSABLE)

    val installCheck = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())
        )
    } else {
        requireContext().packageManager.queryIntentActivities(
            Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER),
            PackageManager.GET_META_DATA
        )
    }

    // 티맵이 설치되어 있다면 앱으로 연결, 설치되어 있지 않다면 스토어로 이동
    if (installCheck.isEmpty()) {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.skt.tmap.ku")))
    } else {
        startActivity(intent)
    }
}

티맵이 레퍼런스도 가장 적고, API도 부정확해 어려움이 많았습니다.

공식문서와 Chat-GPT를 합친 결과 startx와 starty에 출발지의 경도와 위도를, goalx와 goaly에 도착지의 경도와 위도를 설정해야 했습니다.

 

Android 앱에서 외부 지도앱으로 길찾기 기능을 연동할 다른 분들께도 도움이 되었으면 좋겠습니다 :)

728x90
반응형