개발 끄적끄적/Android

[Android Kotlin] 카카오맵 사용하는 방법 (해시키 등록) + 내 위치 표시하기

공간을담다 2020. 6. 3. 16:40
반응형

이번엔 앱에 지도를 띄워보겠습니다. 대표적으로 구글맵과 카카오맵(다음 지도)를 많이 사용합니다.

저는 그 중 카카오맵을 사용했습니다.


 

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 )
    }
}
  1. 사용자의 Location 정보를 받아와 위도, 경도 값을 알아냅니다.
  2. MapPoint.mapPointWithGeoCoord() 메소드를 이용해 사용자의 위치를 입력한 MapPoint를 선언합니다.
  3. MapPoint값을 바탕으로 mapView(지도)의 위치를 옮깁니다.

 

 

 

 

setMapCenterPoint() 메소드 외에도 활용 가능한 메소드가 많습니다.

카카오 공식 문서를 보고 따라하시면 좋을 듯 합니다.

반응형