#1 카카오 지도 안드로이드 앱에 띄우기

0. 서론

카카오 지도 API를 사용하는 방법이 공식 사이트에 잘 나와있는 것 같아서 용감하게 도전해봤는데 막상 해보니 아니었다...😂 API 사용 전 준비사항이 은근히 대충 적혀있어서 결국 구글링을 통해서 해결하게 되었는데 아래의 2가지 조건 때문에 꽤 오랜 시간이 걸렸다.

  • 대부분의 사람들이 kotlin을 사용한다.
  • 안드로이드 스튜디오를 깔아보기만 한 나

아무래도 본격적인 프로젝트 개발에 들어가기 전까지 안드로이드 프로젝트의 대략적인 구조가 무엇인지 등 기초 지식에 대해 공부하는 시간을 가져야 할 것 같다. 혹시나 나처럼 안드로이드 스튜디오의 기초도 모르고 무작정 카카오 지도 API를 써보겠다고 달려드는 사람들의 시간 낭비를 막기 위해서 여기에 내가 개고생했던 지점과 코드 전문을 기록한다.

1. 키해시는 어떻게 구하는 거지?

mainactivity.java의 기존 onCreate 대신에 아래 코드를 복붙한다.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("getKeyHash", "" + getKeyHash(MainActivity.this));
        
    }

    public static String getKeyHash(final MainActivity context) {
        PackageManager pm = context.getPackageManager();
        try {
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
            if (packageInfo == null)
                return null;

            for (Signature signature : packageInfo.signatures) {
                try {
                    MessageDigest md = MessageDigest.getInstance("SHA");
                    md.update(signature.toByteArray());
                    return android.util.Base64.encodeToString(md.digest(), android.util.Base64.NO_WRAP);
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

앱을 실행했을 때 getKeyHash: 뒤에 나오는 부분 중에서 ""의 안에 있는 것을 키해시로 등록해주면 된다.

2. 라이브러리에서 다운로드받은 SDK를 정리하라는데 내 눈에는 도무지 libs도 jniLibs 파일도 보이지 않는다.

라이브러리 창의 좌측 상단을 보면 로봇머리 그림과 Android 적힌 부분이 있다.

여기를 눌러서 project로 바꿔준 후 프로젝트명-app을 차례대로 누르면 그토록 찾아헤매던 libs를 볼 수 있다. 여기에 .jar을 넣어주고 나머지 파일 3개는 app에 직접 jniLibs 파일을 추가한 후 그 안에 넣어주면 된다.

3. 테스트를 해보고 싶은데 자꾸 앱이 실행되지 않고 꺼진다.

나를 가장 오랫동안 개고생시킨 문제인데

Can`t load DaumMapEngineApi.so file

아마 이런 에러 코드를 발견한 후 이 글을 읽고있는 사람도 있을 것이다. 이 에러는 카카오 지도 API가 ARM 아키텍쳐만 지원하기 때문에 virtual device에서는 사용할 수가 없어서 발생하는 문제다. 해결 방법은 자신의 스마트폰을 직접 연결해서 테스트하는 것이다. device manager에서 physical-pair using Wi-Fi를 누르면 QR 코드를 통해 자신의 기기를 등록하는 게 가능하다. 이후에 자신의 기기에서 개발자 모드를 실행함으로써 안드로이드 스튜디오와 무선 연결을 통한 테스트가 가능하다.

4. 도무지 뭐가 문제인지 모르겠다!

그런 사람을 위해 코드 전문을 그냥 냅다 복붙해두겠다. 총 5개의 파일을 수정하거나 만들면 당신도 자신의 기기에 카카오 지도를 띄울 수 있다.

1) mainactivity.java

package com.example.kakaomap_personal;

import android.os.Bundle;
import android.view.ViewGroup;

//추가한 부분 1
import androidx.appcompat.app.AppCompatActivity;
import net.daum.mf.map.api.MapView;
//

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		
        //추가한 부분2
        MapView mapView = new MapView(this);
        ViewGroup mapViewContainer = (ViewGroup) findViewById(R.id.map_view);
        mapViewContainer.addView(mapView);
        //
    }

}

2) activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    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"/>
    <!---->

</RelativeLayout>

3) androidMainfest.xml
android:value에는 kakaoDevelopers에 제공해줬던 네이티브 앱 키를 복붙해주면 된다.

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

	<!--추가한 부분 1-->
    <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"/>
	<!---->
    
    <application
		
        <!--추가한 부분 2-->
		android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config"
        <!---->

        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.KakaoMap_personal"
        tools:targetApi="n">
		
        <!--추가한 부분 3-->
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="6b275ec303646674b725f9e9b859b7b2"/>
        <!---->

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

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

</manifest>

4) build.gradle (:app)
dependencies에만 몇 줄 추가된 것 같은데 file-project structure에서 뭐 하다가 추가된 줄들도 있고 그래서 정확하게 기억이 안 난다...

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.kakaomap_personal"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

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

dependencies {
    implementation files('libs/libDaumMapAndroid.jar')

    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    implementation fileTree(dir: 'src\\main\\jniLibs', include: ['*.aar', '*.jar'], exclude: [])

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

5) network_security_config.xml
res 우클릭 후, new-Android resource file 클릭 후 나오는 창에서 resource type을 XML로 해서 추가한 후 아래 내용을 복붙해준다.

<?xml version="1.0" encoding="utf-8"?>
<!-- http 통신 허용 -->
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

좋은 웹페이지 즐겨찾기