[Android Kotlin] 카카오맵 사용하는 방법 (해시키 등록) + 내 위치 표시하기
이번엔 앱에 지도를 띄워보겠습니다. 대표적으로 구글맵과 카카오맵(다음 지도)를 많이 사용합니다.
저는 그 중 카카오맵을 사용했습니다.
1. 라이브러리 파일 추가
https://apis.map.kakao.com/android/guide/ 에서 카카오 지도 SDK를 다운받아 라이브러리 파일 추가 까지 따라해주세요.
모두 다운 받은 후 좌측 탭 최상단을 Project로 변경하면 위와 같은 파일들을 볼 수 있습니다.
2. Kakao Developers에 플랫폼 등록
- https://developers.kakao.com/ 에 로그인 후 내 애플리케이션 탭으로 들어가서 애플리케이션 추가 버튼을 눌러주세요.
앱 이름과 회사 이름은 나중에 수정할 수 있으니 적당한 이름으로 만들어주세요.
- 플랫폼 탭으로 가서 Android 플랫폼 등록 버튼을 눌러주세요.
여기서 패키지명과 키 해시(해시키)를 등록해야합니다. Android Studio에서 프로젝트를 하나 생성해줍니다.
- 2-1. 패키지명은 Manifest.xml 상단의 package 명을 적으면 됩니다. 제 경우에는 org.myproject 를 적었습니다.
2-2. HashKey를 얻는 방법입니다.
MainActivity.kt로 가셔서 아래와 같이 코드를 작성하고 실행해주세요.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getHashKey()
}
fun getHashKey(){
var packageInfo : PackageInfo = PackageInfo()
try {
packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
} catch (e: PackageManager.NameNotFoundException){
e.printStackTrace()
}
for (signature: Signature in packageInfo.signatures){
try{
var md: MessageDigest = MessageDigest.getInstance("SHA")
md.update(signature.toByteArray())
Log.e("KEY_HASH", Base64.encodeToString(md.digest(), Base64.DEFAULT))
} catch(e: NoSuchAlgorithmException){
Log.e("KEY_HASH", "Unable to get MessageDigest. signature = " + signature, e)
}
}
}
위 코드를 실행하고 Logcat 탭에서 ctrl+F를 이용해 KEY_HASH를 찾아주세요.
하얀 부분이 KEY_HASH입니다. 이 키 해시를 Android 플랫폼 등록 화면에 입력 후 저장해주세요.
3. 앱 키 등록
다음은 요약정보 탭에서 앱 키를 받아옵니다.
REST API 키를 복사해 AndroidManifest.xml 에 아래와 같이 uses-permission과 usesCleartextTraffic, meta-data를 추가합니다.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="복사한 앱 키"/>
마지막으로 카카오 지도 SDK를 gradle에서 추가해주겠습니다.
build.gradle (Project: MyProject)
allprojects {
repositories {
google()
jcenter()
maven{url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
build.gradle (Module: App)
dependencies {
...
//kakao map
compile files('libs/libDaumMapAndroid.jar')
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/libDaumMapAndroid.jar')
}
우측 상단의 Sync Now 를 누르면 카카오맵을 사용하기 전 모든 준비 끝입니다.
이제 앱에 카카오맵을 띄워보겠습니다.
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">
<RelativeLayout
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
import net.daum.mf.map.api.MapPoint
import net.daum.mf.map.api.MapView
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mapView = MapView(this)
val mapViewContainer = map_view
mapViewContainer.addView(mapView)
}
위와 같이 카카오맵이 잘 나오는 것을 볼 수 있습니다. 이제 위치 권한을 받아 맵을 사용자의 위치로 이동시키는 기능을 구현해보겠습니다.
MainActivity.kt
val PERMISSIONS_REQUEST_CODE = 100
var REQUIRED_PERMISSIONS = arrayOf<String>( Manifest.permission.ACCESS_FINE_LOCATION)
...
//override fun onCreate() 내부
map_page_location_btn.setOnClickListener {
val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
if(permissionCheck == PackageManager.PERMISSION_GRANTED) {
val lm: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
try {
val userNowLocation: Location =
lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
val uLatitude = userNowLocation.latitude
val uLongitude = userNowLocation.longitude
val uNowPosition = MapPoint.mapPointWithGeoCoord(uLatitude, uLongitude)
mapView.setMapCenterPoint(uNowPosition, true)
}catch(e: NullPointerException){
Log.e("LOCATION_ERROR", e.toString())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ActivityCompat.finishAffinity(this)
}else{
ActivityCompat.finishAffinity(this)
}
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
System.exit(0)
}
}else{
Toast.makeText(this, "위치 권한이 없습니다.", Toast.LENGTH_SHORT).show()
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, PERMISSIONS_REQUEST_CODE )
}
}
- 사용자의 Location 정보를 받아와 위도, 경도 값을 알아냅니다.
- MapPoint.mapPointWithGeoCoord() 메소드를 이용해 사용자의 위치를 입력한 MapPoint를 선언합니다.
- MapPoint값을 바탕으로 mapView(지도)의 위치를 옮깁니다.
setMapCenterPoint() 메소드 외에도 활용 가능한 메소드가 많습니다.
카카오 공식 문서를 보고 따라하시면 좋을 듯 합니다.