-
[Android Kotlin] 카카오맵 사용하는 방법 (해시키 등록) + 내 위치 표시하기개발 끄적끄적/Android 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 ) } }
- 사용자의 Location 정보를 받아와 위도, 경도 값을 알아냅니다.
- MapPoint.mapPointWithGeoCoord() 메소드를 이용해 사용자의 위치를 입력한 MapPoint를 선언합니다.
- MapPoint값을 바탕으로 mapView(지도)의 위치를 옮깁니다.
setMapCenterPoint() 메소드 외에도 활용 가능한 메소드가 많습니다.
카카오 공식 문서를 보고 따라하시면 좋을 듯 합니다.
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Studio] SQLite을 이용한 내장 DB 활용하기 (0) 2020.06.05 [Android Kotlin] Retrofit2 사용방법 - Interface와 Data Class까지 (1) 2020.06.04 [Android Kotlin] 갤러리에서 이미지 가져와 RecyclerView에 적용하기 (0) 2020.06.03 [Android Kotlin] Permission(권한) 얻기 (0) 2020.06.02 [Android Kotlin] RecyclerView Adapter View Type (리사이클러뷰 여러 뷰타입) (0) 2020.06.01