IT/Android

[KakaoMap API] Kotlin 환경에서 카카오맵 API/SDK 사용하기, 에러 해결

토마토조아 2021. 1. 24. 00:01
728x90

안드로이드에 카카오맵 SDK 를 내장하여 카카오맵을 띄우고 API를 사용하는 방법을 알아보자.

사실 제일 중요한 것은 초반 셋팅을 하는 것이다.

다만, 카카오맵의 초반 셋팅이 쉽지 않은 편이다.

카카오맵 가이드 공홈 을 가면 카카오맵 SDK 를 앱에 내장하는 방법을 친절(??)하게 알려준다.

다만 이는 Java 기준이며, Android Studio 및 Android SDK 버전이 낮은 것을 타겟하고 있는 것 같다. 따라서 저 가이드를 참고하여 Kotlin 기준으로 변경한다 하여도 카카오맵이 제대로 보이지는 않는다.. 유지보수 좀..;;

나의 경우는 Android Studio 4.1.2, Android SDK 16이상, Kotlin을 기준으로 삽질하며 해결하는 방법을 정리해보았다.

핵심 포인트 3가지

1. AndroidManifest.xml
   android:usesCleartextTraffic="true" 가 반드시 필요하다.
   추가하지 않을 경우 net.daum.mf.map.n.api.NativeBaseNetConnection: Cleartext HTTP traffic to ot1.maps.daum-img.net not permitted 발생 (Android SDK 23이상 부터는 필수로 필요함)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mapstest">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MapsTest"
        android:usesCleartextTraffic="true">

        <meta-data android:name="com.kakao.sdk.AppKey" android:value="당신의 API 키 입력"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

2. App 수준의 build.gradle
   //kakao map 주석 아래 내용을 반드시 포함하자. 2곳 참고
   추가하지 않을 경우 java.lang.UnsatisfiedLinkError 오류 발생 (NDK 라이브러리 경로를 제대로 못찾아 발생)

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.mapstest"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        //kakao map
        ndk {
            abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a'
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

    //kakao map
    compile files('libs/libDaumMapAndroid.jar')
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation files('libs/libDaumMapAndroid.jar')

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

 

3. 앱 Hash key는 다음의 코드로 간편하게 사용하자
   아래 메서드 호출하면 앱의 해시키 로그로 얻을 수 있고, 얻어진 해시키를 카카오 개발자 페이지에 등록하자

    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)
            }
        }
    }

 

728x90