Android

[Kotlin/Android] 네이버 지도 현위치 띄우기 (실시간 위치 연결)

연나연 2024. 8. 19. 15:26

[Kotlin/Android] 네이버 지도 연동하기 (tistory.com)

 

[Kotlin/Android] 네이버 지도 연동하기

NAVER MAP (네이버 지도) 연동하기 1. 어플리케이션 등록1. [네이버 클라우드 플랫폼] 접속2. [콘솔]로 이동 3. 회원가입 및 결제정보등록 (이미 했었으면 안해도됨) 4. AI.NAVER API 클릭5. 어플리케이션

ynyn505.tistory.com


저번 글에서 네이버 지도 연동하기를 배워보았는데요 !
그냥 지도 MapFragment만 가지고 무얼 하겠습니까 ! 활용을 해야지요~! 활용을~~!
이번 시간엔 실시간 위치 표시 띄우기 입니당
계속해서 가보자구요 ~! 

(회사에서 라뗴마시며 점심시간만을 기다리는 중.. 점심시간 12분 남았따 ㅎㅎ)

 1. 위치권한 추가

AndroidManifest 에 위치권한 코드를 추가해줍니다.
<!-- 위치 권한 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />​

ex) 

 

2. 위치추적 허용

build.Gradle.kts(:app) 에 코드 추가
// 네이버 지도 위치추적
    implementation("com.google.android.gms:play-services-location:21.0.1")​

 

◈참고
위치 · 네이버 지도 안드로이드 SDK (navermaps.github.io)

 

3. MapFragment 코드 수정

다른 분들은 대부분 Activity에다 네이버의 MapFragment를 두었고, 거기서 본문 코드를 수정했던데.
저는 MainActivity에 MapFragment안에 네이버 MapFragment를 두었고, MapFragment.kts 에서 본문 코드를 만지는 경우입니다. 

(뭐 다른 분들과의 차이라 해봤짜 Activity가 아닌 Fragment에서 진행한다는 점. 네이버 지도 SDK는
Activity 뿐만 아니라 Fragment 에서도 사용할 수 있기에 상관은 없습니다. 렛츠 기릿)

package com.example.android1_practice.ui.Map

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import com.example.android1_practice.MainActivity
import com.example.android1_practice.R
import com.example.android1_practice.databinding.FragmentMapMainBinding
import com.naver.maps.geometry.LatLng
import com.naver.maps.map.LocationSource
import com.naver.maps.map.LocationTrackingMode
import com.naver.maps.map.MapFragment
import com.naver.maps.map.NaverMap
import com.naver.maps.map.OnMapReadyCallback
import com.naver.maps.map.overlay.Marker
import com.naver.maps.map.util.FusedLocationSource

class MapMainFragment : Fragment() , OnMapReadyCallback {

    lateinit var _binding: FragmentMapMainBinding
    lateinit var mainActivity : MainActivity

    // 필요한 전역변수 세 개 만들어주기
    private lateinit var locationSource: LocationSource
    private lateinit var naverMap: NaverMap

    // 위치 권한 요청 코드
    private val LOCATION_PERMISSION_REQUEST_CODE = 1000

    // 위치 권한 배열
    private val PERMISSIONS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment

        _binding = FragmentMapMainBinding.inflate(inflater)
        mainActivity = activity as MainActivity

        return _binding.root
    }

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

        // 위치 권한이 있는지 확인하고 지도 초기화
        if (hasPermission()) {
            initMapView()
        } else {
            requestPermissions(PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE)
        }
    }

    private fun initMapView() {
        val fm = childFragmentManager
        var mapFragment = fm.findFragmentById(R.id.naverMap) as MapFragment?

        if (mapFragment == null) {
            mapFragment = MapFragment.newInstance()
            if (mapFragment != null) {
                fm.beginTransaction().add(R.id.naverMap, mapFragment).commit()
            }
        }

        // OnMapReadyCallback 등록
        if (mapFragment != null) {
            mapFragment.getMapAsync(this)
        }
        locationSource = FusedLocationSource(this, LOCATION_PERMISSION_REQUEST_CODE)
    }

    // 위치 권한 확인
    private fun hasPermission(): Boolean {
        for (permission in PERMISSIONS) {
            if (ContextCompat.checkSelfPermission(requireContext(), permission) != PackageManager.PERMISSION_GRANTED) {
                return false
            }
        }
        return true
    }

    override fun onMapReady(p0: NaverMap) {
        this.naverMap = p0

        // LocationSource 설정
        naverMap.locationSource = locationSource

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

        // 위치 추적 모드 설정
        naverMap.locationTrackingMode = LocationTrackingMode.Follow

    }

}​


위와 같이 코드를 작성하여 현위치 마커 (파란색) + 함께 화면전환 까지 완료되었습니다
끝 ! ㅎㅎ