
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
}
}
'Android-Kotlin📱' 카테고리의 다른 글
[Kotlin] 날씨 앱 만들기 - Retrofit, RecyclerView (0) | 2022.05.25 |
---|---|
[Android/Kotlin] Naver Geocoding 주소로 위도 경도 추출 코틀린 json 데이터 파싱 (0) | 2022.05.24 |
[Android/Kotlin] Naver map SDK 이용한 지도 구현하기 (0) | 2022.05.23 |
[Android/Kotlin] 로그인 시 두 액티비티 구별 Firebase Realtime Database (0) | 2022.05.22 |
Kotlin Fragment ViewBinding (0) | 2022.05.21 |