본문 바로가기
프로그래밍/Android

[Android] 카카오맵 API 길찾기

by Youngs_ 2022. 9. 29.

카카오맵 API에서는 길찾기 기능을 사용하려면 카카오맵 앱을 켜고 해당 위치로 길찾기 기능을 검색하도록 구현해야한다.

private fun howTogoSpot(poiItem: MapPOIItem){
        try {
            val nowLocation = goToNowLocation(false)

            if (nowLocation?.mapPointGeoCoord?.latitude.toString().isBlank() || nowLocation?.mapPointGeoCoord?.longitude.toString().isBlank()){
                return
            }

            val url : String ="kakaomap://route?sp=${nowLocation?.mapPointGeoCoord?.latitude},${nowLocation?.mapPointGeoCoord?.longitude}&ep=${poiItem.mapPoint.mapPointGeoCoord.latitude},${poiItem.mapPoint.mapPointGeoCoord.longitude}&by=PUBLICTRANSIT"

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

            startActivity(intent)

        }catch (e : ActivityNotFoundException){ // 카카오맵이 설치되어있지 않은경우 설치유도
            startActivity(
                Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("market://details?id=net.daum.android.map")
                )
            )
        }
    }
    
    private fun goToNowLocation(goLocation : Boolean) : MapPoint?
    {
        // goLocation 파라미터가 false면 단순히 현재 위치만 MapPoint로 반환해주고 True면 현재위치로 지도를 이동시켜준다.

        val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        if(permissionCheck == PackageManager.PERMISSION_GRANTED) {
            val lm: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
            val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
            try {
                val userNowLocation: Location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)!!
                val uLatitude = userNowLocation.latitude
                val uLongitude = userNowLocation.longitude
                val uNowPosition = MapPoint.mapPointWithGeoCoord(uLatitude, uLongitude)

                if (goLocation) {
                    binding.mapView.setMapCenterPoint(uNowPosition, true)
                }

                return uNowPosition

            }catch(e: NullPointerException){
                Log.e("LOCATION_ERROR", e.toString())
                ActivityCompat.finishAffinity(this)

//                val intent = Intent(this, MainActivity::class.java)
//                startActivity(intent)
                System.exit(0)
            }
        }else{
            Toast.makeText(this, "위치 권한이 없습니다.", Toast.LENGTH_SHORT).show()
            ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE)
        }
        return null
    }

아래 코드는 list에 값이 안들어가서 카카오맵이 설치되어도 무조건 플레이스토어로 간다.. 그래서 위 코드를 사용했다.

더보기
val url : String ="kakaomap://route?sp=37.537229,127.005515&ep=37.4979502,127.0276368&by=FOOT"
val intent =  Intent(Intent.ACTION_VIEW, Uri.parse(url))
intent.addCategory(Intent.CATEGORY_BROWSABLE)
    val list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)

//카카오맵 어플리케이션이 사용자 핸드폰에 깔려있으면 바로 앱으로 연동
//그렇지 않다면 다운로드 페이지로 연결

if (list.isEmpty()){
    startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=net.daum.android.map")))
}else{
    startActivity(intent)
}

 

공식문서를 참고하면 더 좋을듯하다.

https://apis.map.kakao.com/android/guide/#urlscheme_route

 

GUIDE - 지도맵 URL Scheme - 길찾기

댓글