네이버 지도 API 활용 앱 - 1(MapView, Google Services LocationSource)
-
Naver Map API
-
ViewPager2
-
FrameLayout
-
CoordinatotLayout
-
BottomSheetBehavior
-
Retrofit
-
Gilde
네이버 지도 API 사용
아래 사진과 같이 네이버 클라우드 플렛폼에 어플리케이션 추가

프로젝트 수준의 settings.gradle에 종속성 추가
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url 'https://naver.jfrog.io/artifactory/maven/'
}
}
}
앱 수준의 build.gradle에 종속성 추가
// 네이버 지도
implementation 'com.naver.maps:map-sdk:3.11.0'
gradle.properties 파일에 아래 두 줄을 추가하지 않으면 에러가 발생한다. 꼭 추가해 주자
android.useAndroidX=true
android.enableJetifier=true
strings.xml 안에 naver_map_client_id 이름으로 client id 값 추가
Manifest.xml 파일 어플리케이션 안에 메타 데이터를 추가
<meta-data
android:name="com.naver.maps.map.CLIENT_ID"
android:value="@string/naver_map_client_id"/>
네이버 지도를 사용하는 2가지 방법
-
프래그먼트 (프래그먼트의 생명 주기)
-
MapView (생명 주기를 직접 넘겨줘야함, 이번에 사용할 방법)
MapView에 생명주기 넘겨주기
아래 코드와 같이 mapView 객체에 엑티비티의 생명주기를 따라가도록 넘여줘야 함
class MainActivity : AppCompatActivity() {
private val binding by lazy{ ActivityMainBinding.inflate(layoutInflater) }
private val mapView by lazy{ binding.mapView }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
mapView.onCreate(savedInstanceState)
}
override fun onStart() {
super.onStart()
mapView.onStart()
}
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
override fun onStop() {
super.onStop()
mapView.onStop()
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
}
}
맵 가져오기
// MainActivity.kt
private lateinit var naverMap:NaverMap
// OnMapReadyCallback 객체를 매개변수로 받기 때문에
// 메인 엑티비티가 OnMapReadyCallback 인터페이스를 상속, 구현
// onCreate 안에
mapView.getMapAsync(this)
override fun onMapReady(map: NaverMap) {
naverMap = map
// 일반 적인 레벨
naverMap.maxZoom = 18.0
naverMap.minZoom = 10.0
// 위도 경도로 지도 화면 이동
val cameraUpdate = CameraUpdate.scrollAndZoomTo(LatLng(37.498095, 127.027610),15.0)
naverMap.moveCamera(cameraUpdate)
// 현위치 표시(버튼을 누르면 바로 내위치 이동하기 기능, 위치 권한 필요)
val uiSetting = naverMap.uiSettings
uiSetting.isLocationButtonEnabled = true
}
위 코드에서 위치 권한이 필요하므로 아래 코드를 통해 권한을 받아오자
<!--Manifest.xml-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
tools:ignore="CoarseFineLocation" />
// 위치 권한 받아오기, 앱 수준의 build.gradle
implementation 'com.google.android.gms:play-services-location:19.0.1'
// MainACtivity.kt
private lateinit var locationSource:FusedLocationSource
override fun onMapReady(map: NaverMap) {
...
// 현위치 표시(버튼을 누르면 바로 내위치 이동하기 기능, 위치 권한 필요)
val uiSetting = naverMap.uiSettings
uiSetting.isLocationButtonEnabled = true
// 위치 및 권한을 받아옴 ( 위치 정보를 편하게 가져올 수 있음)
locationSource = FusedLocationSource(this@MainActivity, LOCATION_PERMISSION_REQUEST_CODE)
naverMap.locationSource = locationSource
}
// 위치 권한 요구에 필요한 함수 오버라이딩
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
// 위치 권한이 아닐 때는 넘김
if(requestCode != LOCATION_PERMISSION_REQUEST_CODE){
return
}
// 위치 권한일 때 처리
if(locationSource.onRequestPermissionsResult(requestCode, permissions, grantResults)){
if(!locationSource.isActivated){
naverMap.locationTrackingMode = LocationTrackingMode.None
}
return
}
}
// 위치 권한 요청 코드
companion object{
private const val LOCATION_PERMISSION_REQUEST_CODE = 1000
}
마커로 위치 찍기
// onMapReady() 안에서
// 마커, 위치를 찍을 수 있는 핀 찍기
val marker = Marker()
marker.position = LatLng(37.498095, 127.027610)
marker.map = naverMap
marker.icon = MarkerIcons.BLACK
marker.iconTintColor = Color.RED
최종 화면
