안드로이드 카카오맵 with Kotlin
2022/09/08(목요일)
안드로이드 카카오맵 with Kotlin
- SDK파일 다운로드
⇒ 카카오 공식문서에서 DownLoad SDK 버튼을 눌러 다운받고 압축을 푼다. 위치는 상관 없다.
카카오 공식 문서 : https://apis.map.kakao.com/android/guide/
- 카카오 개발자 사이트 - 개발자 등록, 앱 생성
⇒ 개발자 사이트 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()
참고로 이건 (개발용)디버그 키의 해시값이므로
배포 시에는 릴리즈 키를 발급해서 릴리즈 키 해시값을 넣어줘야 한다!
- 다운 받은 SDK 파일을 프로젝트에 추가
android Kakao Map 라이브러리는 libDaumMapAndroid.jar와 아키텍쳐별로 libMapEngineApi.so 세개의 바이너리로 구성되어 있습니다. libDaumMapAndroid.jar은 /app/libs/ 에복사 그리고 libMapEngineApi.so 파일은 /app/source/main/jniLibs 로 아키텍쳐별 디렉토리하에 복사해 주시면 됩니다
- app단의 build 파일에 의존성implementation 추가
⇒ 다시 우측 상단에서 Project로 설정했던 걸 Android로 바꿔서 보기가 편하게 만들자. build.gradle(Module: app) 파일의 dependencies 부분에 아래 코드 두 줄을 추가해준다. (아래 사진의 두 build.gradle 중 아래 것이다)
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/libDaumMapAndroid.jar')
- 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 에는 개발자 사이트에서 생성한 앱의 네이티브 앱 키를 넣어준다. 앱 키는 아래 사진처럼 확인할 수 있다.
- 코드 실행
⇒ 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)해주면 된다.