안드로이드 앱개발 - 심화 2

kkomin·2023년 9월 13일
0

Android Studio

목록 보기
29/44

😗 사용자 위치 얻기

안드로이드에서 지도는 필수 앱이다. 지도에서는 현재 사용자의 위치 권한을 얻는 것이 순서이기 때문에 사용자 위치 얻는 방법을 알아보자.


✅ 위치 접근 권한

사용자의 위치를 추적하기 위해서는 총 3가지의 권한이 필요하다.

  • android_permission_ACCESS_COARSE_LOCATION

    • 와이파이 또는 모바일 데이터를 사용해 기기의 위치에 접근하는 권한
      (1블록 오차 발생)
  • android_permission_ACCESS_FINE_LOCATION

    • 이용할 수 있는 위치 제공자를 사용해 최대한 정확한 위치에 접근하는 권한
  • android_permission_ACCESS_BACKGROUND_LOCATION

    • Android10 이상에서 백그라운드 상태에서 위치에 접근하는 권한


🕶️ 플랫폼 API의 위치 매니저

사용자의 위치를 얻는 방법으로는 LocationManger라는 시스템 서비스를 이용한다.

val manager = getSystemService(LOCATION_SERVICE) as LocationManager

⬆️ 위치 제공자

위치를 어디서 받을지 위치 제공자를 지정하는데, GPS이동통신망, Wifi, Passive를 통해 위치를 받아올 수 있다.


⬇️ 위치 정보 받기

result를 하나 선언하고 provider에 manager.allProviders를 호출하면 현재 기기에어떤 위치 제공자가 있는지 받을 수 있다.

현재 기기에 어떤 위치 제공자가 있는지를 알고 싶을 경우, LocationManager의 allProviders 프로퍼티 이용

  var result = "All Providers : "
  val providers = manager.allProviders
  for(provider in providers) {
      result += "$providder."
  }
  Log.d("maptest", result)

현재 사용할 수 있는 위치 제공자를 알아보기 위한 getProviders() 함수 이용

result = "Enabled Providers : "

💜 위치 정보 얻기

  • getAccuaracy() : 정확도

  • getLatitude() : 위도

  • getLongitude() : 경도

  • getTime() : 획득 시간

  if(ContextCompat.checkSelfPermission (
                  this, 
                  Manifest.permission.ACCESS_FINE_LOCATION
              ) == PackageManger.PERMISSION_GRANTED
          ) {
              val location : Location? = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
              location?.let {
              	  // 위도 받아오기
                  val latitude = location.latitude
                  // 경도 받아오기
                  val longiturde = location.longitude
                  // 정확도 받아오기
                  val accuracy = location.accuracy
                  // 획득 시간 받아오기
                  val time = location.time
                  Log.d("map_test", "$latitude, $location, $accuarcy, $time")
              }
          }

주기적으로 계속 위치를 가져와야 할 경우, LocationListener 이용

  • onLocationChanged( ) : 새로운 위치를 가져오면 호출

  • onProviderEnabled( ) : 위치 제공자가 이용할 수 있는 상황 시 호출

  • onProviderDisabled( ) : 위치 제공자가 이용할 수 없는 상황 시 호출

val listener : LocationListener = object : LocationListener {
	override fun onLocationChanged(location : Location) {
    	Log.d("map_test", "${location.latitude), $(location.longitude), ${location.accuracy}")
        }
        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10_00L, 10f, listener)
        manager.removeUpdates(listener)
}


📁 GooglePlay 서비스의 위치 라이브러리

구글 맵의 위치 라이브러리 서비스 사용 방법에 대해 정리해보자.

1. gradle 추가

implementation 'com.google.android.gms:play-services:12.0.1'

2. Fused Location Provider 핵심 클래스

  • FusedLocationProviderClient : 위치 정보 얻기
  • GoogleApiClient : 위치 제공자 준비 등 다양한 콜백 제공
    • GoogleApi Client에서는 GoogleApiClient.ConnectionCallbacks 및 GoogleApiClient.OnConnection FaliedListener 인터페이스 구현한 객체 지정
val connectionCallback = object: GoogleApiClient.ConnectionCallbacks{
            override fun onConnected(p0: Bundle?) {
                // 위치 제공자를 사용할 수 있을 때
                // 위치 획득
            }

            override fun onConnectionSuspended(p0: Int) {
                // 위치 제공자를 사용할 수 없을 때
            }
        }
        val onConnectionFailCallback = object : GoogleApiClient.OnConnectionFailedListener{
            override fun onConnectionFailed(p0: ConnectionResult) {
                // 사용할 수 있는 위치 제공자가 없을 때
            }
        }
        val apiClient = GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(connectionCallback)
            .addOnConnectionFailedListener(onConnectionFailCallback)
            .build()

3. FusedLocationProviderClient 초기화

val providerClient = LocationService.getFusedLocationProviderClient(this)

4. GoogleApiClient 객체에 위치 제공자 요청

appClient.connect()

5. onConnected()함수에서 getLastLocation() 함수 호출

onConnected() 함수에서 FusedLocationProviderClient의 getLastLocation() 함수를 호출해준다.

val connectionCallback = object: GoogleApiClient.ConnectionCallbacks{
            override fun onConnected(p0: Bundle?) {
                // 위치 제공자를 사용할 수 있을 때
                // 위치 획득
            }

            override fun onConnectionSuspended(p0: Int) {
                // 위치 제공자를 사용할 수 없을 때
            }
        }
        val onConnectionFailCallback = object : GoogleApiClient.OnConnectionFailedListener{
            override fun onConnectionFailed(p0: ConnectionResult) {
                // 사용할 수 있는 위치 제공자가 없을 때
            }
        }
        val apiClient = GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(connectionCallback)
            .addOnConnectionFailedListener(onConnectionFailCallback)
            .build()


🗺️ Google Map 만들기

👀 지도 사용 설정하기

1. gradle에 파일 생성

2. permission 등록

위치 정확도에 대한 permission 및 인터넷 연결을 위한 permission을 추가해준다.

3. 구글맵 API 이용하는 키 등록

네이버 맵이나 카카오 맵 등 맵을 사용할 때 무조건 필요한 과정이다. 사이트에 나의 정보를 등록해 놓고 키를 발급받아 발급받은 키를 manifest 코드 안에 넣어야 맵을 구동시킬 수 있다!

(보라색 부분에 발급받은 키 값 입력)


구글 개발자 콘솔 ➡️ 지도 API 키 얻기

1. 레이아웃 xml

id가 mapView인 fragment 하나만 설정해주면 된다.

2.지도 제어하기

1. 지도 출력하는 뷰 얻기

mapView 프래그먼트를 만든 곳에 getMapAsync 해서 맵 연결을 시키면 연결 완료 시, Callback을 걸었기 때문에 연결 완료 시 onMapReady가 발생한다.

2. 지도 중심 이동하기

지도 중심을 이동하려며 위경도 좌표가 필요하다 ! 좌표를 잡고 줌레벨, 얼마나 확대할지를 설정하고 위에서 인자로 받은 구글맵을 가지고 moveCamera라는 메소드를 이용해서 position 이동

3. 마커 표시하기

맵 위에 아이콘을 올리는 마커를 만들 때는 icon을 넣고 position 위치를 넣고 마커에 대한 title, snippet(간단한 설명)을 추가해준다.

4. 위치 요청

현재 위치 받아오기를위해 locationRequest를 통해 interval1초에 한번씩 받고 정확도를 설정해준 뒤 LocationCallback을 설정해주면 내가 설정한 interval만큼 위치 정보롤 전달해준다.

💻 실행화면

profile
소소한 코딩 일기

0개의 댓글