[application] Google Map 현재 위치 표시하기

PUJIN·2023년 7월 25일
0

코딩 - 프로젝트

목록 보기
7/13
post-thumbnail

위치 권한 설정


  • AndroidManifest.xml에 위치 권한 추가
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  • 권한 목록
val permissionList = arrayOf(
	Manifest.permission.ACCESS_FINE_LOCATION,
	Manifest.permission.ACCESS_COARSE_LOCATION
)
  • 권한 허용 request
requestPermissions(permissionList,0)



현재 위치


  • MapFragment 객체 추출
val supportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
  • getMapAsync : 구글 지도 사용 준비 완료시 반응

📍 사용 method

  • checkSelfPermission : 권한 허용 여부 확인
    • 허용 : PERMISSION_GRANTED
    • 허용 X : PERMISSION_DENIED
  • getLastKnownLocation : 현재 저장되어 있는 위치 정보값 가져오기
lateinit var mainGoogleMap: GoogleMap
      
supportMapFragment.getMapAsync {

	// 구글맵 객체 변수에 담아서 사용
	mainGoogleMap = it


	// 위치 정보 관리하는 객체
	val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

	val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
	val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)

	if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
		// 현재 저장되어 있는 위치 정보값
		val location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
		val location2 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)

		if(location1 != null){
			setMyLocation(location1)
        } else if(location2 != null){
			setMyLocation(location2)
		}

		// 현재 위치 측정하여 지도 갱신
		getMyLocation()
	}
}



위치 갱신


  • 현재 위치 값 받아오기
fun getMyLocation(){
	val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
	val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
    
	if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED) {

		val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

		// 위치 측정 리스너
		myLocationListener = object : LocationListener {
			override fun onLocationChanged(p0: Location) {
				setMyLocation(p0)
			}
		}

		// 위치 측정 요청
		if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
			locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, myLocationListener!!)
		}

		if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        	locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, myLocationListener!!)
		}
	}
}
  • 현재 위치의 위도 경도값으로 해당 위치로 이동
    • moveCamera : 지도 이동
    • animateCamera : 지도 이동 + 애니메이션 적용
    • position : 마커 위치 설정
    • icon : 마커 이미지(아이콘) 설정
var myLocationListener: LocationListener? = null

// 현재 사용자 위치에 표시되는 마커
var myMarker: Marker? = null

fun setMyLocation(location: Location){

	// 위치 측정 중단
	if(myLocationListener != null) {
		val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
		locationManager.removeUpdates(myLocationListener!!)
		myLocationListener = null
	}

	// 위도 & 경도 관리 객체
	val latLng = LatLng(location.latitude, location.longitude)

	// 지도를 이용시키기 위한 객체
	//val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)
	val cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15f)

	// mainGoogleMap.moveCamera(cameraUpdate)
	mainGoogleMap.animateCamera(cameraUpdate)

	val markerOptions = MarkerOptions()
	markerOptions.position(latLng)

	val markerBitmap = BitmapDescriptorFactory.fromResource(android.R.drawable.ic_menu_mylocation)
	markerOptions.icon(markerBitmap)

	// 기존 마커 제거
	if(myMarker != null) {
		myMarker?.remove()
		myMarker = null
	}
	
    mainGoogleMap.addMarker(markerOptions)

	Toast.makeText(this@MainActivity, "위도 : ${location.latitude}, 경도 : ${location.longitude}", Toast.LENGTH_SHORT).show()

}



옵션 설정


  • 확대 축소 기능
it.uiSettings.isZoomControlsEnabled = true
  • 현재 위치 표시 기능
it.isMyLocationEnabled = true
  • 현재 위치 표시하는 버튼 표시 기능
it.uiSettings.isMyLocationButtonEnabled = false
  • 맵타입 설정
it.mapType = GoogleMap.MAP_TYPE_NONE
it.mapType = GoogleMap.MAP_TYPE_NORMAL
it.mapType = GoogleMap.MAP_TYPE_TERRAIN
it.mapType = GoogleMap.MAP_TYPE_SATELLITE
it.mapType = GoogleMap.MAP_TYPE_HYBRID



⌨️ 전체 코드


class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    val permissionList = arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )

    // 위치 측정 리스너
    var myLocationListener: LocationListener? = null

    // 구글 지도 객체
    lateinit var mainGoogleMap: GoogleMap

    // 현재 사용자 위치에 표시되는 마커
    var myMarker: Marker? = null

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        MapsInitializer.initialize(this,MapsInitializer.Renderer.LATEST,null)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        requestPermissions(permissionList,0)

        // MapFragment 객체 추출
        val supportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
        // 구글 지도 사용 준비 완료시 반응하는 리스너 등록
        supportMapFragment.getMapAsync {

            // 구글맵 객체 변수에 담아 사용
            mainGoogleMap = it

            // 지도의 옵션 설정
            // 확대 축소 기능
            it.uiSettings.isZoomControlsEnabled = true

            // 현재 위치 표시 기능
            it.isMyLocationEnabled = true

            // 현재 위치 표시하는 버튼 표시 여부
            it.uiSettings.isMyLocationButtonEnabled = false

            // 맵타입
            // it.mapType = GoogleMap.MAP_TYPE_NONE
            // it.mapType = GoogleMap.MAP_TYPE_NORMAL
            // it.mapType = GoogleMap.MAP_TYPE_TERRAIN
            // it.mapType = GoogleMap.MAP_TYPE_SATELLITE
            // it.mapType = GoogleMap.MAP_TYPE_HYBRID


            // 위치 정보 관리하는 객체 가져오기
            val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

            // 권한 허용 여부 확인
            // 허용 : PERMISSION_GRANTED
            // 허용 X : PERMISSION_DENIED
            val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
            val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)

            if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){
                // 현재 저장되어 있는 위치 정보값 가져오기
                val location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
                val location2 = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)

                if(location1 != null){
                    setMyLocation(location1)
                } else if(location2 != null){
                    setMyLocation(location2)
                }

                // 현재 위치 측정하여 지도 갱신하는 함수
                getMyLocation()
            }
        }
    }

    // 현재 위치의 위도 경도값을 통해 구글 지도를 해당 위치로 이동
    fun setMyLocation(location: Location){

        // 위치 측정 중단
        if(myLocationListener != null) {
            val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
            locationManager.removeUpdates(myLocationListener!!)
            myLocationListener = null
        }

        // 위도 & 경도 관리 객체
        val latLng = LatLng(location.latitude, location.longitude)

        // 지도를 이용시키기 위한 객체
        //val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)
        val cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15f)

        // 지도 이동
        // mainGoogleMap.moveCamera(cameraUpdate)
        // 애니메이션 적용
        mainGoogleMap.animateCamera(cameraUpdate)

        // 현재 위치에 마커 표시
        val markerOptions = MarkerOptions()
        markerOptions.position(latLng)

        // 마커 이미지 변경
        val markerBitmap = BitmapDescriptorFactory.fromResource(android.R.drawable.ic_menu_mylocation)
        markerOptions.icon(markerBitmap)

        // 기존에 표시한 마커를 제거한다.
        if(myMarker != null){
            myMarker?.remove()
            myMarker = null
        }
        mainGoogleMap.addMarker(markerOptions)

        Toast.makeText(this@MainActivity, "위도 : ${location.latitude}, 경도 : ${location.longitude}", Toast.LENGTH_SHORT).show()

    }

    fun getMyLocation(){
        val a1 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_FINE_LOCATION)
        val a2 = ActivityCompat.checkSelfPermission(this@MainActivity, Manifest.permission.ACCESS_COARSE_LOCATION)
        if(a1 == PackageManager.PERMISSION_GRANTED && a2 == PackageManager.PERMISSION_GRANTED){

            val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager

            // 위치 측정 리스너
            myLocationListener = object : LocationListener {
                override fun onLocationChanged(p0: Location) {
                    setMyLocation(p0)
                }
            }

            // 위치 측정 요청
            if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    0, 0f, myLocationListener!!)
            }

//            if(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
//                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
//                    0, 0f, myLocationListener!!)
//            }
        }
    }
}



🎞️ 실행 영상


0개의 댓글

관련 채용 정보