Never Map API 사용하기

LeeEunJae·2022년 7월 27일
2

Study Kotlin

목록 보기
2/20

📌 실행 화면

📌 클라이언트 ID 발급받기

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'
}

📌 클라이언트 ID 지정

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'

📌 MainActivity.kt 전체 코드

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
    }

}
profile
매일 조금씩이라도 성장하자

0개의 댓글