https://just-coding-record.tistory.com/28

 

 

[Android/Kotlin] Naver map SDK 이용한 지도 구현하기

https://navermaps.github.io/android-map-sdk/guide-ko/0.html 소개 · 네이버 지도 안드로이드 SDK No results matching "" navermaps.github.io 이 글은 네이버에서 제공하는 안드로이드 SDK를 참고하여 작성..

just-coding-record.tistory.com

네이버지도를 사용하기 전 초기설정( 의존성, ID 발급, 기본 코드) 작성한 글입니다.

AndroidManifext.xml (권한 명시)

네이버 지도 SDK는 사용자에게 위치권한을 요구하지 않으며, 위치 추적 기능을 사용하고자 하는 앱은 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION 권한을 명시 해야합니다.

<manifest>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

 

build.gradle (의존성 추가)

사용자가 위치권한을 동의 한 경우Google Play 서비스 사용을 위해 소스 추가

→ 최적의 위치를 반환하는 구현체인 FusedLocationSource를 제공

dependencies {
    implementation("com.google.android.gms:play-services-location:16.0.0")
}

 

.kt

OnMapReadyCallback을 등록하면 비동기로 NaverMap 객체를 얻을 수 있으며

객체(NaverMap)가 준비되면 onMapReady() 콜백 메서드가 호출

 

class NearLocation : Fragment(), OnMapReadyCallback {

 

전역변수

 

    //FusedLocationSource 뷰의 객체를 전달하고 권한 요청 코드 지정
    private lateinit var locationSource: FusedLocationSource

    //mapView를 받아오기 위해 변수 설정
    private lateinit var mapView: MapView

    private lateinit var naverMap: NaverMap

 

 

onViewCreated

FusedLocationSource

런타임 권한 처리를 위해 Activity 또는 Fragment 필요로 하며 권한요청 코드 지정

getMapAsync 메서드를 호출하여 프래그먼트에서 콜백을 설정, 비동기로 NaverMap 객체를 얻을 수 있습니다.

 

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    locationSource = FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE)
    mapView = view.findViewById(R.id.map_view)
    mapView.onCreate(savedInstanceState)

    mapView.getMapAsync(this)
}

 

 

onMapReady

 

   //뷰 시작시 위치 이동 mapView.getMapAsync(this)를 통해 즉시 콜백
   override fun onMapReady(naverMap: NaverMap) {

        //NaverMap으로부터 UiSettings 인스턴스를 가져오기 (위치, 나침반, 실내지도 층 피커, 줌버튼)
        val uiSettings = naverMap.uiSettings

        //초기 위치 설정, 위경도
        val cameraUpdate = CameraUpdate.scrollTo(LatLng(37.562238,127.065175)).animate(CameraAnimation.Easing, 1000)
        naverMap.moveCamera(cameraUpdate)

        //현위치 버튼 활성화
        uiSettings.isLocationButtonEnabled = true

        //현위치 추적, 나선형 꼴 모양
        naverMap.locationSource = locationSource
        naverMap.locationTrackingMode = LocationTrackingMode.Follow

    }

 

onRequestPermissionsResult

권한 요청 이후 유저가 권한을 허용 했을 시

onRequestPermissionResult()의 결과를

FusedLocationSource의 onRequestPermissionsResult()에 전달

 

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        if (locationSource.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
            if (!locationSource.isActivated) { // 권한 거부됨
                naverMap.locationTrackingMode = LocationTrackingMode.None
            }
            return
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

 

 

FusedLocationSource의 필요한 RequestCode 지정

    //컴파일 시간에 결정되는 상수(값이 변하지 않음)
    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 1000
    }

 

 

결과 화면 및 전체 소스코드

 

//OnMapReadyCallback을 등록하면 비동기로 NaverMap 객체를 얻을 수 있으며  객체(NaverMap)가 준비되면 onMapReady() 콜백 메서드가 호출
class NearLocation : Fragment(), OnMapReadyCallback {

    //FusedLocationSource 뷰의 객체를 전달하고 권한 요청 코드 지정
    private lateinit var locationSource: FusedLocationSource

    //mapView를 받아오기 위해 변수 설정
    private lateinit var mapView: MapView

    private lateinit var naverMap: NaverMap

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_near_location, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //FusedLocationSource : 런타임 권한 처리를 위해 Activity 또는 Fragment 필요로 하며 권한요청 코드 지정
        locationSource = FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE)
        mapView = view.findViewById(R.id.map_view)
        mapView.onCreate(savedInstanceState)

        //getMapAsync 메서드를 호출하여 프래그먼트에서 콜백을 설정, 비동기로 NaverMap 객체를 얻을 수 있습니다.
        mapView.getMapAsync(this)
    }

    //뷰 시작시 위치 이동
   override fun onMapReady(naverMap: NaverMap) {

        //NaverMap으로부터 UiSettings 인스턴스를 가져오기 (위치, 나침반, 실내지도 층 피커, 줌버튼)
        val uiSettings = naverMap.uiSettings

        //초기 위치 설정, 위경도
        val cameraUpdate = CameraUpdate.scrollTo(LatLng(37.562238,127.065175)).animate(CameraAnimation.Easing, 1000)
        naverMap.moveCamera(cameraUpdate)

        //현위치 버튼 활성화
        uiSettings.isLocationButtonEnabled = true

        //현위치 추적, 나선형 꼴 모양
        naverMap.locationSource = locationSource
        naverMap.locationTrackingMode = LocationTrackingMode.Follow

    }

    //권한 요청 이후 유저가 권한을 허용 했을 시
    // onRequestPermissionResult()의 결과를 FusedLocationSource의 onRequestPermissionsResult()에 전달
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        if (locationSource.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
            if (!locationSource.isActivated) { // 권한 거부됨
                naverMap.locationTrackingMode = LocationTrackingMode.None
            }
            return
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

    //아래 생명주기
    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 onDestroyView() {
        super.onDestroyView()
        mapView.onDestroy()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }

    //컴파일 시간에 결정되는 상수(값이 변하지 않음)
    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 1000
    }
}

 

복사했습니다!