๊พธ์ค€ํ•จ์ด ์ง„๋ฆฌ๋‹ค!!

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ์˜ค๋Š˜์ด ๋˜๊ณ ํ”ˆ ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜ ๋ธ”๋กœ๊ทธ

Android/Kotlin

[Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ ์นด์นด์˜ค๋งต API ์‚ฌ์šฉํ•˜๊ธฐ - ์นด์นด์˜ค๋งต ํ™”๋ฉด์— ๋„์šฐ๊ธฐ

๋ށ์š” 2022. 11. 25. 14:10

์•ˆ๋…•ํ•˜์„ธ์š”

์˜ค๋Š˜์€ ์นด์นด์˜ค ๋งต API๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด

ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค  ํ•ฉ๋‹ˆ๋‹ค.

์œ„์น˜์ •๋ณด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋Š” ๋งŽ์ง€๋งŒ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์นด์นด์˜ค ๋งต์ด ๋ฌธ์„œ๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด์žˆ๋‹ค๊ณ  

์ƒ๊ฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋ฐ”๋กœ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ์š”??


API ์„ค์ •

 

1. ๋จผ์ € Kakao Developers๋กœ ๊ฐ€์„œ ๋กœ๊ทธ์ธ์„ ํ•ด์ค๋‹ˆ๋‹ค.

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

2. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“ค์–ด๊ฐ€ ์•ฑ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ ํ™”๋ฉด

 

3. ์ƒ์„ฑ๋œ ์•ฑ์—์„œ ํ”Œ๋žซํผ์„ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๋“ฑ๋กํ™”๋ฉด

ํ”Œ๋žซํผ ๋“ฑ๋ก์‹œ์— ํŒจํ‚ค์ง€๋ช…์€ AndroidManifestํŒŒ์ผ์˜ package๋ช…์„ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ผ“ URL์€ ๋ฐฐํฌ์‹œ์— ์ œ๊ณต๋œ URL์„ ์ž…๋ ฅํ•˜๋ฉด ๋˜๊ณ  ๋ฐฐํฌ๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ํ‚ค ํ•ด์‹œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ•ด๋‹น ๊ฐ’์€ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ ํ›„ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋œ ํ•ด์‰ฌ ํ‚ค๋ฅผ ๋ถ™์—ฌ ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

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

ํ‚ค ํ•ด์‹œ๊ฐ€ ๋œจ๋Š” ๋กœ๊ทธ


APP ์„ค์ •

 

apis.map.kakao.com/android/guide/

์œ„ ๋งํฌ์— ์ ‘์†ํ•˜์—ฌ

SDK ๋‹ค์šด

SDK๋ฅผ ๋‹ค์šด ๋ฐ›์•„ ์ค๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œํ•œ SDK์˜ ์••์ถ•์„ ํ•ด์ œํ•˜๊ณ 

main ๋ฐ‘์— jniLibs์ด๋ฆ„์œผ๋กœ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ .so ํŒŒ์ผ๋“ค์„ ๋ณต์‚ฌํ•ด์ฃผ๊ณ 

libsํด๋” ๋ฐ‘์— jarํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

SDK ํด๋” ๊ตฌ์กฐ

 

1. build.gradle ์„ค์ •ํ•˜๊ธฐ

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

 

2. Manifest ์„ค์ •ํ•˜๊ธฐ

<application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/beach_icon"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BeachCongetionPJ"
        android:usesCleartextTraffic="true" // http url ์‚ฌ์šฉ์„ ์œ„ํ•œ ์„ค์ •
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="31">
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

// Manifest์˜ android:networkSecurityConfig๋ฅผ ์„ค์ •
//๊ถŒํ•œ ์„ค์ •   
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 // ์•ฑํ‚ค ์„ค์ •
 <activity
            android:name=".ui.MainActivity"
            android:exported="true">

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value=""
            />
    </application>

์œ„์—์„œ AppKey๋Š” ๋ฐ˜๋“œ์‹œ activity์™ธ๋ถ€ application๋‚ด๋ถ€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์šธ๋Ÿฌ, value์— ๋“ค์–ด๊ฐˆ ์•ฑ ํ‚ค๋Š” ์•„๋ž˜ ์ค‘ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ํ‚ค๋ฅผ ๋ถ™์—ฌ ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์นด์นด์˜ค ๋งต ๋„์šฐ๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ ์•ฑ์—์„œ ์ง€๋„๋ฅผ ๋„์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.lee.beachcongetion.databinding.ActivityTestBinding
import net.daum.mf.map.api.MapView

class TestActivity : AppCompatActivity(){
    private lateinit var binding : ActivityTestBinding
    private lateinit var mMap : MapView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTestBinding.inflate(layoutInflater).also {
            setContentView(it.root)
        }
        mMap = MapView(this@TestActivity) // MapView ์ƒ์„ฑ
        binding.mapView.addView(mMap)// FrameLayout์— MapView add
    }
}

์‹คํ–‰ํ™”๋ฉด

์ด์ƒ์œผ๋กœ ์นด์นด์˜ค ๋งต API ์‚ฌ์šฉํ•˜์—ฌ ๋งต ๋„์šฐ๋Š” ๋ฐฉ๋ฒ•์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์œผ๋ก  ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด POI ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Ž

 

์˜ค๋Š˜๋„ ์ฆ์ฝ”ํ•˜์„ธ์š” :)