Naver Maps Api

sumi Yoo·2022년 11월 10일
0

시작하기

네이버 클라우드 플랫폼에서 클라이언트 ID를 발급받아야 한다.
https://console.ncloud.com/dashboard

의존성 추가

가이드에는 아래처럼 나와있다.

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url 'https://naver.jfrog.io/artifactory/maven/'
        }
    }
}

하지만, 안드로이드 스튜디오 Arctic Fox버전 이후에 만든 프로젝트는 build.gradle 이 아니라 settings.gradle에 아래와 같이 레포지토리 정보를 추가해야 한다.

settings.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // 추가
        maven {
            url 'https://naver.jfrog.io/artifactory/maven/' 
        }
    }
}
rootProject.name = "Promise"
include ':app'

build.gradle(:app)

 // naver map
    implementation 'com.naver.maps:map-sdk:3.15.0'

했더니?

Your project has set android.useAndroidX=true but configuration debugRuntimeClasspath still contains legacy support libraries

이런 오류가 떴다..

gradle.properties

Jetifier를 사용하기 위해서는 gradle.properties 파일에 다음 코드를 추가한다.

android.useAndroidX=true
android.enableJetifier=true // 추가

해줬더니 해결이 되었다.

android.useAndroidX=true
Android 플러그인은 지원 라이브러리 대신 적절한 AndroidX 라이브러리를 사용합니다.
android.enableJetifier=true
Android 플러그인은 바이너리를 다시 작성해 기존 타사 라이브러리를 자동으로 이전하여 AndroidX를 사용합니다.

Jetifier?

Support Library에 종속적인 라이브러리를 비슷한 AndroidX로 마이그레이션할 때 사용한다.

즉, 과거 안드로이드에서 자주 사용된 support library를 사용하는 써드 파티 라이브러리를 우리가 개발하는 AndroidX 프로젝트와 호환되도록 돕는 툴이다.

클라이언트 ID 지정

<manifest>
    <application>
        <meta-data
            android:name="com.naver.maps.map.CLIENT_ID"
            android:value="YOUR_CLIENT_ID_HERE" />
    </application>
</manifest>

지도 표시

    <androidx.fragment.app.FragmentContainerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        android:name="com.naver.maps.map.MapFragment" />

MapFragment 및 MapView는 지도에 대한 뷰 역할만을 담당하므로 API를 호출하려면 인터페이스 역할을 하는 NaverMap 객체가 필요하다. MapFragment 또는 MapView의 getMapAsync() 메서드로 OnMapReadyCallback을 등록하면 비동기로 NaverMap 객체를 얻을 수 있다. NaverMap 객체가 준비되면 onMapReady() 콜백 메서드가 호출된다.

class MapFragmentActivity : FragmentActivity(), OnMapReadyCallback {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.map_fragment_activity)

        val fm = supportFragmentManager
        val mapFragment = fm.findFragmentById(R.id.map) as MapFragment?
                ?: MapFragment.newInstance().also {
                    fm.beginTransaction().add(R.id.map, it).commit()
                }

        mapFragment.getMapAsync(this)
    }

    @UiThread
    override fun onMapReady(naverMap: NaverMap) {
        // ...
    }
}

오버레이, 마커, 카메라 이동

@UiThread
    override fun onMapReady(naverMap: NaverMap) {
        val coord = LatLng(37.5154133, 126.9071288) // 영등포역 위도, 경도
        
        val locationOverlay = naverMap.locationOverlay
        locationOverlay.isVisible = true
        locationOverlay.position = coord
        
        val cameraUpdate = CameraUpdate.scrollTo(coord)
        naverMap.moveCamera(cameraUpdate)
        
        val marker = Marker()
        marker.position = coord
        marker.map = naverMap
    }

@UiThread

주석이 달린 메서드 또는 생성자는 UI 스레드에서만 호출되어야 함을 나타냅니다. 주석이 달린 요소가 클래스인 경우 클래스의 모든 메서드를 UI 스레드에서 호출해야 합니다.

https://navermaps.github.io/android-map-sdk/guide-ko/2-1.html
https://stackoverflow.com/questions/71044526/your-project-has-set-android-useandroidx-true-but-configuration-debugruntimec
https://youngest-programming.tistory.com/659
https://bb-library.tistory.com/276

0개의 댓글