얼마 전까지 진행하던 안드로이드 포트폴리오에 Map API가 필요했는데 카카오 맵 API가 적당한 것 같아 채택하고 사용했었다.
https://developers.kakao.com/docs/latest/ko/getting-started/app
제일 믿을 수 있을 것 같았던 공식 문서를 찾아갔는데 정말 참담했다. 깔끔하게 잘 정리되어 있길래 따라 해 봤지만 안되더라. (물론 내가 잘못했거나 레퍼런스 문서 작성 당시의 버전과 달라져서 일 수도 있겠지만...)
그래서 열심히 여기저기 찾아보며 겨우 성공했는데 과정이 순탄치 않았기에 나와 같은 사람들도 있을 수 있고, 개인적인 정리 차원으로도 좋을 것 같아 포스팅하기로 했다.
카카오 개발자 사이트에 어플리케이션 정보를 등록한다.
당연하지만 카카오 계정이 필요하다. 로그인 후 개발자 등록을 하면 된다. (나는 이미 등록해버려서 과정을 올릴 수가 없는데, 일반적인 SNS 소셜 계정 연동 같은 과정일 뿐이어서 정말 간단하다.)
개발자 등록을 완료 했다면 상단의 '내 애플리케이션'으로 이동한다.
'애플리케이션 추가하기' 선택
'앱 이름'란에 API를 사용할 앱의 이름을 정확하게 넣어야 한다. 적혀있는 것처럼 '정확하지 않은 정보일 경우 서비스 이용이 제한'되기 때문에 유의하자. 단, 사업자가 아닌 개인은 아무렇게나 넣어도 상관없다.
일단 생성은 완료했다. 이제 플랫폼을 등록시켜줘야 하는데, 그전에 앱의 '키 해시'값이 필요하다.
어플리케이션의 키 해시 값을 획득한다.
https://healthcoding.tistory.com/8
import android.content.pm.PackageManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Base64
import android.util.Log
import androidx.annotation.RequiresApi
import java.security.MessageDigest
class MainActivity : AppCompatActivity() {
private val TAG = "SOL_LOG"
@RequiresApi(Build.VERSION_CODES.P)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
val information = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
val signatures = information.signingInfo.apkContentsSigners
for (signature in signatures) {
val md = MessageDigest.getInstance("SHA").apply {
update(signature.toByteArray())
}
val HASH_CODE = String(Base64.encode(md.digest(), 0))
Log.d(TAG, "HASH_CODE -> $HASH_CODE")
}
} catch (e: Exception) {
Log.d(TAG, "Exception -> $e")
}
}
}
(지금은 제한이 없는 상태이지만 혹시나 나중에 블로그 설정으로 드래그나 우클릭을 금지시킬 수도 있으니 코드를 적어놓은 메모장 파일도 첨부한다.)
실행시켜보면 로그로 키 해시 값이 출력된다. 카카오 개발자 사이트에 플랫폼 등록에 사용된다. 복사해두자.
플랫폼 등록에 어플리케이션의 패키지 명도 필요하다. AndroidManifest에서 상단에 있는 'package'의 값도 복사해두자.
좌측 메뉴에서 '플랫폼' 선택 후 'Android 플랫폼 등록'을 눌러 알아낸 패키지명과 키 해시 값을 넣어준다. 마켓 URL은 패키지명을 넣으면 알아서 들어간다.
이제 등록해줄 건 끝났다. 프로젝트로 가자.
AndroidManifest에 Permission을 등록한다.
<uses-permission android:name="android.permission.INTERNET" />
API 통신을 위해 인터넷 퍼미션을 추가해준다.
usesCleartextTraffic을 추가한다.
android:usesCleartextTraffic="true"
AndroidManifest에 meta data를 추가한다.
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="네이티브 앱 키" />
value에는 카카오 개발자 사이트에 등록했던 곳에 가서 '네이티브 앱 키'를 넣어준다.
build.gradle(Module)에 의존성을 추가해준다.
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/libDaumMapAndroid.jar')
카카오맵 SDK를 프로젝트에 추가한다.
https://apis.map.kakao.com/android/guide/
다운로드한 압축 파일 중에서
'libs' 폴더는 프로젝트명\app\src\main에 넣어주고 폴더명을 'jniLibs'로 바꿔준다.
'libDaumMapAndroid.jar' 파일은 프로젝트명\app\libs에 넣어준다.
모든 작업은 끝냈다. MapView로 확인해보자.
이제 Activity의 xml에 'MapView'를 추가시켜준다. SDK 파일을 정상적인 경로에 넣어주었다면 'MapView'를 추가시킬 수 있다. 만약 존재하지 않는다는 경고가 나온다면 SDK 파일을 제대로 넣어주지 못한 것이니 확인해볼 것.
빌드
MapView가 정상적으로 표시되면 끝. 여기서 가장 중요한 것이 있다. MapView는 무.조.건 실제 안드로이드 기기에서만 정상적으로 사용할 수 있다. 안드로이드 스튜디오 내의 가상 기기(AVD)로 실행하면 앱이 의문사하니 반드시 알아둘 것.
그밖에 검색이나 현재 위치, 마커 등은 별도의 기능들이다. 더 다루게 되면 추가로 글에 추가해 둘 예정이다.
개발하면서 알 수 없는 문제들이 발생했었는데 적어두려 한다.
1. MapView가 있는 Activity를 빌드하면 앱이 바로 죽어버리는 문제
: 안드로이드 가상 기기(AVD)로 빌드했거나, libs폴더의 이름을 'jniLibs'로 바꿔주지 않았거나, 매니페스트 파일에 meta-data의 value에 네이티브 앱 키가 틀린 경우 발생.
2. 앱이 죽는건 아닌데 MapView에 아무것도 표시되지 않고 회색으로만 나오는 문제
: 매니페스트에 android:usesCleartextTraffic="true"를 넣어주지 않을 경우 발생
'Android (Kotlin)' 카테고리의 다른 글
[Android/안드로이드] 프래그먼트(Fragment)가 뭐지? (0) | 2022.08.23 |
---|---|
[Android/안드로이드] 서비스는 뭐지? (Background, Foreground) (0) | 2022.08.19 |
[Android/안드로이드] Context는 대체 뭐지? (0) | 2022.08.16 |
[Android/안드로이드] 어플리케이션 4대 컴포넌트 (앱 구성 요소) (0) | 2022.08.14 |
[Android/안드로이드] 안드로이드 스튜디오와 기기를 무선으로 디버깅 하는 방법 (2) | 2022.08.11 |
최근댓글