Lumpy Space Princess - Adventure Time
공부/Android

[Android/Kotlin] Kakao Maps API 연동하기

yaebb_82 2023. 2. 2.

 

 

1. Kakao Maps API 사이트

Kakao Map API 사이트 : https://apis.map.kakao.com/android/guide/

 

• SDK 다운로드

  : Download SDK 버튼을 눌러준다. (최신 버전으로 다운로드)

다운로드 했을 때, 파일 내부 상태

 

 

 

2. Android_DaumMap_SDK_[다운로드한 버전]\libs 내부 파일들

• 안드로이드 스튜디오 (Android Studio)

  : app\src\main 경로에 jniLibs 폴더를 생성해서 클릭된 폴더 3개를 옮겨준다.

 

: app\libs 경로에 libDaumMapAndroid.jar 파일을 옮겨준다.

  (Project 상태로 해야 libs 폴더가 보인다는데, 내 경우에는 안보여서 libs 폴더를 따로 생성해주었다.)

 

 

 

3. build.gradle(:app)에 의존성 추가

dependencies {
  ...
  
  //kakao maps sdk
  implementation files('libs/libDaumMapAndroid.jar')
  
}

: 의존성을 추가해주고 Sync Now를 눌러준다.

 

 

 

4. Kakao Developers 사이트

Kakao Developers : https://developers.kakao.com/

 

 

• 내 애플리케이션 카테고리 → 애플리케이션 추가하기

: 애플리케이션 추가하기를 눌러 위와 같은 정보들을 기입해주면 된다.

: 내 경우 예전에 소셜 로그인 구현을 하면서 만들어놓은 것을 활용했다.

 

 

• 플랫폼 → 안드로이드

1) 패키지명

  : 안드로이드 스튜디오 manifest의 package명

 

2) 마켓 URL

  : 구글 플레이에 등록된 앱이면 해당 앱의 마켓 URL 입력해준다.

  : 구글 플레이에 등록된 앱이 아닌 경우 없음으로 선택한다.

    (cf. 위와 같이 패키지명을 입력하면 자동으로 들어감)

 

3) 키 해시

  : 추출한 키 해시를 적어준다.

  : 여러 명이서 사용하게 된다면 각각의 키 해시를 추출하여 줄 바꿈으로 구분해주어 등록한다.

    (cf. 만약 앱을 출시를 하게 된다면, 릴리즈 키 해시도 따로 추가를 해주어야 한다.)

 

 

• 키 해시(key hash) 추출하기

// 앱 해시 키 얻는 코드
fun getAppKeyHash() {
    try {
        val info =
            packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
            for (signature in info.signatures) {
                var md: MessageDigest
                md = MessageDigest.getInstance("SHA")
                md.update(signature.toByteArray())

                val something = String(Base64.encode(md.digest(), 0))
                Log.e("Hash key", something)
            }
    } catch (e: Exception) {

        Log.e("name not found", e.toString())
    }
}

// 함수를 호출하여 확인
getAppKeyHash()

: 해시 키는 외부에 노출하지 않도록 해야 한다.

 

cf.) 내 경우에는 이미 소셜 로그인 때문에 Kakao SDK가 이미 세팅이 되어있어서, 아래와 같은 코드로 키 해시를 구했다.

import com.kakao.sdk.common.util.Utility

var keyHash = Utility.getKeyHash(this)
Log.d("키해시확인", $keyHash)

 

 

 

5. AndroidManifest.xml

• Permission 추가하기

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

1) INTERNET

  : 지도 정보를 받아오기 위해 인터넷 연결이 필요하다.

 

2) ACCESS_FINE_LOCATION

  : GPS와 네트워크를 사용해서 사용자의 정확한 위치 정보를 가져올 때 필요하다.

 

3) ACCESS_COARSE_LOCATION

  : 네트워크만 사용해서 사용자의 대략적인 위치 정보만 가져올 때 필요하다.

 

 

• <application>에서 android:usesCleartextTraffic 설정

: android:usesCleartextTraffic 값을 "true"로 설정해준다.

cf.) 지도 가져올 때 HTTP 프로토콜을 이용하기 때문에 → HTTP 접근을 허용하기 위해서 해당 속성을 true로 지정해주어야 한다.

      (이 속성은 SDK23부터 지원한다.)

 

 

• Native App Key 추가

  : 네이티브 앱 키 확인하기 (Kakao Developers → 앱 설정 → 요약 정보 → 앱 키)

 

  : <application> 하위에 <meta-data> 추가

cf.) value에 들어가는 값 → Native App Key

 

 

 

6. 지도 띄우기

• xml 상에서 띄우기

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".presentation.main.find.FindFragment">

        <net.daum.mf.map.api.MapView
            android:id="@+id/kakao_map_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

 [다른 방법] 동적으로 추가

package com.starters.hsge.presentation.main.find

import android.os.Bundle
import android.view.View
import com.starters.hsge.R
import com.starters.hsge.databinding.FragmentFindBinding
import com.starters.hsge.presentation.common.base.BaseFragment
import net.daum.mf.map.api.MapView

class FindFragment : BaseFragment<FragmentFindBinding>(R.layout.fragment_find) {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val mapView = MapView(context)
        binding.kakaoMapView.addView(mapView)
    }
}

 

: 이 때에는 xml 상에서 위와 같이 작성하지 않고, MapView대신 Layout을 추가해준다. (해당 Layout에 id를 부여한다.)

: 그리고 코드상에서 위와 같이 addView()로 추가해줄 수 있다.

 

 

 결과

 

 

 


 

 

🔗 참고

https://velog.io/@iamjm29/Android-Kakao-%EC%A7%80%EB%8F%84-API-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 https://epdev.tistory.com/8

 https://velog.io/@iamjm29/Android-%ED%82%A4%ED%95%B4%EC%8B%9Ckey-hash-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0

 

 

 

반응형

댓글