지도 API에 대한 학습을 진행하려고 구글맵, 카카오맵 중 어느것을 사용할까 고민을 했습니다.
구글맵의 유료 정책이 서서히 도입되는 것 같고,
어차피 국내에 한해 지도를 제작하는 현 상황만 고려한다면 카카오맵 학습을 하는것이 괜찮을 것 같아 사용을 시작했습니다.
그 과정에서 MapView를 띄우는 과정에서만도 알려진 오류란 오류는 다 걸려본 것 같아서.. ㅠㅠ
그래서 정리하는 겸 포스팅을 하기로 했습니다.
https://developers.kakao.com/
위 사이트에 접속하여 로그인을 해줍니다.
로그인 아이디는 자신이 사용하고 있는 카카오톡 계정
으로 로그인 하면 되기 때문에, 간단하게 접속 가능합니다. (카카오톡 안쓰시는 분들은 사실상 없을테니깐..?)
접속하면 개발자 등록이 가능합니다.
개발자 등록이 되어있지 않은 사용자일 경우 자동으로 설정창으로 이동되어 등록됩니다.
등록이 되어있는지 확인하기 위해서는
아래 사진 우측 상단의 빨간색 계정 정보를 클릭하신 뒤 계정 설정 탭을 누르셨을 때 이동하는 페이지에서 디벨로퍼스 프로필 정보란이 채워져 있다면 등록이 된겁니다.
이후, 애플리케이션을 추가해야합니다.
메인 홈 화면에서 내 애플리케이션을 클릭하신 뒤,
애플리케이션 추가하기 버튼을 눌러 작업을 진행합니다.
연습용으로 사용할 경우 대강 정해주시면 됩니다.
만들어진 애플리케이션의 세부항목으로 들어가면 요약 정보
탭에 여러 앱키들이 존재합니다.
그리고 그 아래, 플랫폼을 설정하는란이 보입니다. (혹은 좌측 메뉴에 플랫폼 탭)
여기서 안드로이드 플랫폼 등록이 가능합니다.
패키지명
은 사용하는 안드로이드 패키지의 명을 그대로 따 적어주면 됩니다.
마켓 URL
은 패키지명 입력시 자동으로 부여되지만, 연습을 위한 프로젝트에서는 없음 설정하시면 됩니다.
키 해시
값은 릴리즈 목적이 아닌 경우에는 디버그 키를 입력해주시면 됩니다.
fun getAppKeyHash() {
try {
val info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
for(i in info.signatures) {
val md: MessageDigest = MessageDigest.getInstance("SHA")
md.update(i.toByteArray())
val something = String(Base64.encode(md.digest(), 0)!!)
Log.e("Debug key", something)
}
} catch(e: Exception) {
Log.e("Not found", e.toString())
}
}
위의 코드를 MainActivity
의 onCreate()
등에서 실행시키면 로그에 key값이 찍힙니다.
이를 얻어와 입력해주시면 됩니다.
이후 저장하시면 해시 키 등록까지 완료됩니다.
https://apis.map.kakao.com/android/guide/
위 사이트에 접속하시면 최신버전의 SDK를 다운받는 링크가 존재합니다.
글 작성기준 v.1.4.1.0 (2019/11/12) 버전이 최신입니다.
링크를 다운받고 압축을 푸시면 libs
폴더안에 libDaumMapAndroid
라는 jar파일 한 개와,
arm***
형식의 폴더 3개(폴더 안에는 각각의 환경에서 적용되는 libDaumMapEngineApi.so
가 들어있음)가 존재하는 것을 확인 가능합니다.
안드로이드 스튜디오에 들어갑니다.
현재 파일 탐색이 android단에서 이루어지고 있습니다. 이를 아래 사진의 과정을 참고하여 Project
로 바꿔줍니다.
이후, 다운로드 받았던 파일들을 하나씩 붙여넣기를 진행합니다.
우선, libs
디렉터리에 libDaumMapAndroid.jar
을 붙여넣어줍니다.
또한, main
디렉터리에 jniLibs
라는 디렉터리를 생성해줍니다!
이후, .so
파일이 들어있는 세 개의 폴더를 넣어줍니다.
최종적으로는 아래의 사진처럼 구성이 되어야합니다.
이후, 다시 android 탐색 단으로 돌아와줍니다.
[File] -> [Project Structure]에서 Dependencies
탭에 들어갑니다.
Jar Dependency를 추가하면 항목 선택란에
아까 붙여넣었던 libDaumMapAndroid.jar
항목 선택이 가능합니다.
등록해주시고 module단 gradle에 들어가시면 jar파일이 implement 되어있음을 확인할 수 있습니다.
kakao developers 사이트의 애플리케이션 앱 키를 따옵니다.
android studio에서 사용할 네이티브 앱 키
를 복사해둡니다.
manifests에 들어가서 application태그 안에 meta-data
를 추가해줍니다.
이 때, activity 태그 안에 넣거나 application 태그 밖으로 넣지 않도록 주의합니다.
<meta-data android:name="com.kakao.sdk.AppKey" android:value="your_app_key"/>
또한, 지도의 여러 기능을 사용하기 위해 위치 권한 사용을 알립니다.
<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"/>
지도를 넣을 ViewGroup에 id 네이밍을 합니다.
<?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">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
저같은 경우는 자식 ConstriantLayout에 지도를 넣을것이고, mapView
id를 부여했습니다.
이후 코드단에서 MapView
객체를 만들어주고 ViewGroup의 addView()
메서드를 사용하여 지도를 띄워줍니다.
val map = MapView(this)
mapView.addView(map)
MapView
를 import할 때, net.daum.mf.map.api
에서 불러오셔야 합니다.
이제 실행하시면 지도가 화면상에 보임을 확인할 수 있습니다.
오류에 대한 문제는 아래에 기술했습니다.
권한 처리는 TedPermission
을 사용했고, 추가적인 언급을 하지 않았습니다.
이에 대해서는 각자의 권한 처리 방법에 따라 문제를 해결하시면 될 것 같습니다.
진짜 삽질했던 오류입니다..
구글링해서 찾아보려고 하니 대부분 옛날 자료여서 예전에 있던 오류에 대한 해결책만 주구장창 나와서 애먹었습니다.
여기에서 오류가 날거라고 생각도 못했는데..
저 같은 경우의 해결책은 아래와 같았습니다.
MapView를 import할 때,
net.daum.android.map
net.daum.mf.map.api
중 어느 곳에서 데려올거냐는 이야기를 합니다.
여기서 아래꺼(net.daum.mf.map.api) 해주셔야 합니다... 위에거 하면 저처럼 튕깁니다.
그리고, 추가적으로 위의 방법으로 문제가 해결 안되시는 분들은
jar파일과 so파일들이 디렉터리에 알맞게 위치해있는지 다시 한 번 확인하셔도 좋을 것 같습니다.
이제 앱은 튕기지 않는데, 지도의 이미지가 불러와지지 않는 현상이 발생했습니다.
cleartext HTTP traffic to ot0.maps.daum-img.net not permitted
위와 같은 에러 문구가 키워드인 것 처럼 뜨면서 말이죠.
이는, 기본적으로 지도 API가 http통신을 하면서 정보를 불러오는데, 안드로이드9 이상부터는 https 통신이 베이스이기 때문에 http통신에 대한 예외 처리를 해주지 않으면 정보를 얻어올 수 없어 발생하는 문제입니다.
해결책은 아래와 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">maps.daum-img.net</domain>
</domain-config>
</network-security-config>
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
이후 실행하시면 지도가 정상적으로 화면에 나타나는 것을 확인할 수 있습니다.
글보고 되게 큰 도움을 얻었습니다.
허나 오타를 지적하자면, manifests 설정 및 권한 설정 단락에서
activity 태그 안에 넣거나 application 태그 밖으로 넣지 않도록 주의합니다 .를
application 태그 안에 넣거나 manifests태그 밖으로 넣지 않도록 주의합니다. 로 바꿔야 할것 같습니다.