앱 모듈의 build.gradle
에 의존성을 추가해줍니다.
implementation "com.google.android.gms:play-services-location:20.0.0"
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
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
}
위치 권한을 허용했는지 확인하는 메서드 입니다.
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()
}
}
}
사용자가 권한 요청에 대한 응답을 했을 때 호출되는 메서드 입니다.
글 잘 봤습니다.