https://navermaps.github.io/android-map-sdk/guide-ko/1.html
공식 문서를 참고해서 애플리케이션을 생성하고 클라이언트 ID를 발급받는다.
allprojects {
repositories {
google()
mavenCentral()
maven("https://naver.jfrog.io/artifactory/maven/")
}
}
공식문서에는 Project 수준의 Gradle 파일에 위와 같이 추가하라고 나와 있지만, android studio 버전 차이 때문인지 필자의 프로젝트 Gradle 파일에는 해당 코드를 작성할 allprojects{} 가 존재하지 않았다.
setting.gradle 파일에 추가해주면 된다.
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
jcenter()
maven{
url 'https://naver.jfrog.io/artifactory/maven/'
}
}
}
마지막으로 Module 수준의 Gradle 파일에 의존성을 추가한다.
dependencies {
implementation 'com.naver.maps:map-sdk:3.11.0'
}
manifest에 다음과 같이 클라이언트 ID를 지정해주면 된다.
필자는 id 를 리소스에 미리 추가 해두고 사용했다.
<application
...
<meta-data
android:name="com.naver.maps.map.CLIENT_ID"
android:value="@string/naver_map_client_id"/>
...
</application>
<?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">
<com.naver.maps.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
다음과 같이 Naver Map에서 제공하는 MapView를 레이아웃에 추가한 후 에뮬레이터를 실행시키면 네이버 지도가 화면에 나온다.
메인 액티비티에 코드를 따로 작성하지 않아도 실행시켰을 때 정상적으로 네이버 지도가 나오지만, 액티비티의 라이프사이클에 따라 네이버 지도의 동작이 제대로 안될 수 있으므로 아래와 같이 라이프사이클을 연결 시켜줘야 한다.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.dldmswo1209.airbnb.databinding.ActivityMainBinding
import com.naver.maps.map.MapView
import com.naver.maps.map.NaverMap
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mapView.onCreate(savedInstanceState)
}
override fun onStart() {
super.onStart()
binding.mapView.onStart()
}
override fun onResume() {
super.onResume()
binding.mapView.onResume()
}
override fun onPause() {
super.onPause()
binding.mapView.onPause()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
binding.mapView.onSaveInstanceState(outState)
}
override fun onStop() {
super.onStop()
binding.mapView.onStop()
}
override fun onDestroy() {
super.onDestroy()
binding.mapView.onDestroy()
}
override fun onLowMemory() {
super.onLowMemory()
binding.mapView.onLowMemory()
}
}
FusedLocationSource 를 사용하기 위해 의존성을 추가해야 한다.
implementation 'com.google.android.gms:play-services-location:18.0.0'
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.dldmswo1209.airbnb.databinding.ActivityMainBinding
import com.naver.maps.geometry.LatLng
import com.naver.maps.map.*
import com.naver.maps.map.overlay.Marker
import com.naver.maps.map.util.FusedLocationSource
import com.naver.maps.map.util.MarkerIcons
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var naverMap: NaverMap
private lateinit var binding: ActivityMainBinding
private lateinit var locationSource: FusedLocationSource
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mapView.onCreate(savedInstanceState)
binding.mapView.getMapAsync(this)
}
override fun onMapReady(map: NaverMap) {
naverMap = map
// 확대/축소 범위 설정
naverMap.maxZoom = 18.0
naverMap.minZoom = 10.0
// 지도 초기 위치
val cameraUpdate = CameraUpdate.scrollTo(LatLng(37.497885,127.02751))
naverMap.moveCamera(cameraUpdate)
// 현재 위치를 찾는 버튼 활성화
val uiSetting = naverMap.uiSettings
uiSetting.isLocationButtonEnabled = true
// 위치를 반환하는 FusedLocationSource 생성
locationSource = FusedLocationSource(this@MainActivity, LOCATION_PERMISSION_REQUEST_CODE)
// 위치소스 지정
naverMap.locationSource = locationSource
// 마커 표시
val marker = Marker()
marker.position = LatLng(37.500493,127.029740)
marker.map = naverMap
marker.icon = MarkerIcons.BLACK
marker.iconTintColor = Color.RED
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// requestCode 확인
if(requestCode != LOCATION_PERMISSION_REQUEST_CODE)
return
// 권한 팝업을 쉽게 구현하기 위해서 google 에서 제공하는 라이브러리를 사용
if(locationSource.onRequestPermissionsResult(requestCode,permissions,grantResults)){
if(!locationSource.isActivated){
naverMap.locationTrackingMode = LocationTrackingMode.None
}
return
}
}
override fun onStart() {
super.onStart()
binding.mapView.onStart()
}
override fun onResume() {
super.onResume()
binding.mapView.onResume()
}
override fun onPause() {
super.onPause()
binding.mapView.onPause()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
binding.mapView.onSaveInstanceState(outState)
}
override fun onStop() {
super.onStop()
binding.mapView.onStop()
}
override fun onDestroy() {
super.onDestroy()
binding.mapView.onDestroy()
}
override fun onLowMemory() {
super.onLowMemory()
binding.mapView.onLowMemory()
}
companion object{
private const val LOCATION_PERMISSION_REQUEST_CODE = 10000
}
}