NaverMap 사용하기 - 현재 위치로 지도 이동

BongKu·2023년 7월 27일
0

Android

목록 보기
14/30
post-thumbnail

1. 의존성 추가

앱 모듈의 build.gradle 에 의존성을 추가해줍니다.

implementation "com.google.android.gms:play-services-location:20.0.0"

2. AndroidManifest.xml에 permission 설정

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

3. 권한 요청 및 현재 위치로 지도 이동

  • 필요 변수 선언
    private val LOCATION_PERMISSION_REQUEST_CODE = 1000

    private val PERMISSIONS = arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )

    private lateinit var naverMap: NaverMap
    private lateinit var locationSource: FusedLocationSource

LOCATION_PERMISSION_REQUEST_CODE: 위치 권한 요청에 사용되는 요청 코드를 정의하는 상수입니다. 위치 권한을 요청할 때 해당 요청 코드를 함께 전달하여 어떤 권한 요청에 대한 결과인지를 구분할 수 있습니다. 값은 임의로 원하는 값으로 설정해도 됩니다.

PERMISSIONS: 위치 권한 요청 시 요청할 권한들을 정의하는 배열입니다.

naverMap: Naver 지도 객체를 담는 변수입니다. onMapReady 콜백에서 전달받은 NaverMap 객체를 이 변수에 할당하여 사용합니다.

locationSource: FusedLocationSource 객체를 담는 변수입니다. FusedLocationSource는 위치 서비스와 Naver 지도를 연동하여 현재 위치 정보를 제공하는 역할을 합니다. 이 변수를 사용하여 현재 위치를 받아오고 지도의 위치 관련 설정을 할 수 있습니다.

class MainActivity : AppCompatActivity(), OnMapReadyCallback{
    override fun onCreate(savedInstanceState: Bundle?) {
    			.
                .
        if(!hasPermission()){
            requestPermissions(PERMISSIONS,LOCATION_PERMISSION_REQUEST_CODE)
        }else{
            initMapView()
        }
        		.
                .
    }
}
  • onMapReady
    override fun onMapReady(p0: NaverMap) {
        this.naverMap = p0
        naverMap.locationSource = locationSource
        naverMap.uiSettings.isLocationButtonEnabled = true
        naverMap.locationTrackingMode = LocationTrackingMode.Follow
    }

네이버 지도 객체를 초기화하고, 위치 추적 모드를 설정합니다.

  • 초기 지도 셋팅 initMapView()
    private fun initMapView() {
        locationSource = FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE)

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

지도를 초기화 하고 지도가 준비되면 onMapReady 콜백이 호출됩니다.

  • 위치 권한 체크 hasPermission()
   private fun hasPermission(): Boolean {
        for (permission in PERMISSIONS) {
            if (ContextCompat.checkSelfPermission(this, permission)
                != PackageManager.PERMISSION_GRANTED
            ) {
                return false
            }
        }
        return true
    }

위치 권한을 허용했는지 확인하는 메서드 입니다.

  • 위치 권한 요청 @override onRequestPermissionResult()
    //위치 권한 요청
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
                initMapView()
            }
        }
    }

사용자가 권한 요청에 대한 응답을 했을 때 호출되는 메서드 입니다.

profile
화이팅

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

글 잘 봤습니다.

답글 달기