안드로이드 카카오맵 with Kotlin

  1. SDK파일 다운로드

⇒ 카카오 공식문서에서 DownLoad SDK 버튼을 눌러 다운받고 압축을 푼다. 위치는 상관 없다.

카카오 공식 문서 : https://apis.map.kakao.com/android/guide/

  1. 카카오 개발자 사이트 - 개발자 등록, 앱 생성

⇒ 개발자 사이트 https://developers.kakao.com/ 에서 개발자등록을 하고 앱을 생성한다.

내 안드로이드 프로젝트 파일의 패키지명이 필요하다.

패키지명은 프로젝트 파일 중 AndroidManifest.xml 상단에서 확인할 수 있다.

해시키 구하는 코드

// 앱 해시 키 얻는 코드
        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()

참고로 이건 (개발용)디버그 키의 해시값이므로

배포 시에는 릴리즈 키를 발급해서 릴리즈 키 해시값을 넣어줘야 한다!

  1. 다운 받은 SDK 파일을 프로젝트에 추가

android Kakao Map 라이브러리는 libDaumMapAndroid.jar와 아키텍쳐별로 libMapEngineApi.so 세개의 바이너리로 구성되어 있습니다. libDaumMapAndroid.jar은 /app/libs/ 에복사 그리고 libMapEngineApi.so 파일은 /app/source/main/jniLibs 로 아키텍쳐별 디렉토리하에 복사해 주시면 됩니다

  1. app단의 build 파일에 의존성implementation 추가

⇒ 다시 우측 상단에서 Project로 설정했던 걸 Android로 바꿔서 보기가 편하게 만들자. build.gradle(Module: app) 파일의 dependencies 부분에 아래 코드 두 줄을 추가해준다. (아래 사진의 두 build.gradle 중 아래 것이다)

implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/libDaumMapAndroid.jar')
  1. AndroidMenifest.xml 파일에 Permission과 AppKey 추가

Permission 코드 추가

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

AppKey 코드 추가

<meta-data android:name="com.kakao.sdk.AppKey" android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXX"/>

android:value 에는 개발자 사이트에서 생성한 앱의 네이티브 앱 키를 넣어준다. 앱 키는 아래 사진처럼 확인할 수 있다.

  1. 코드 실행

⇒ activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="안드로이드 카카오맵 API 활용 : \nMapView 띄우기"
        android:textColor="#822FD5"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/clKakaoMapView"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

</androidx.constraintlayout.widget.ConstraintLayout>

⇒ MainActivity.kt

package com.example.kakaomaptestapp

import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Base64
import android.util.Log
import com.example.kakaomaptestapp.databinding.ActivityMainBinding
import net.daum.mf.map.api.MapView
import java.security.MessageDigest

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        val mapView = MapView(this)
        binding.clKakaoMapView.addView(mapView)

/*        // 앱 해시 키 얻는 코드
        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()*/
    }
}

MapView를 보이는 부분은 이 두 줄만 집중하면 된다.

val mapView = MapView(this)         

binding.clKakaoMapView.addView(mapView)

뷰 바인딩을 사용하지 않고 바로 id로 접근하거나 findViewById를 쓴다면

binding.부분을 제외하고 뷰 요소 접근해서 .addView(mapView)해주면 된다.