19. [위치 정보 활용]

728x90

[19. 위치 정보 활용]

[19-1. 사용자 위치 얻기]

        1) 플랫폼 API 이용하는 방법

        2) 구글 PLAY 서비스 제공 라이브러리 이용하는 방법

[위치 접근 권한]

-각 상황에 맞춰 매니파스트 파일에 다음 권한 등록

ACCESS_COARSE_LOCATION 정확도 높아야 할 때
ACCESS_FINE_LOCATION 대략의 위치 확인할 때
ACCESS_BACKGROUND_LOCATION 백그랑누드 상황에서 위치 접근할 때

 

< + 서비스 컴포넌트에서 위치 접근 필요한 경우 >

-foregroundServiceType 속성에 “location” 지정 필요

<service
     android:name=“MyNavigationService” 
     android:foregroundServiceType = “location”
    . . .
</service>

[플랫폼 API의 위치 매니저 사용]

1) LocationManager 위치 매니저 사용
2) 위치 제공자 지정
3) 위치 정보 얻기
      ⓐ 위치 한 번만 가져오기
           LocationManagergetLastKnownLocation() 함수 사용
      ⓑ 위치 계속 가져오기
           LocationListener 구현 객체 사용

 

 1) 위치 매니저 사용 : LocationManager 위치 매니저

val manager = getSystemService(LOCATION_SERVICE) as LocationManager

 2) 위치 제공자 지정

         <위치 제공자 종류>

GPS GPS 위성 이용
Network 이동 통신망 이용
Wifi 와이파이 이용
Passive 다른 앱에서 이용한 마지막 위치 정보 이용

   ⇒ [현재 기기에 어떤 위치 제공자 있는지 알고 싶다면? ] LocationManagerallProviders 프로퍼티 이용

   ⇒ [지금 사용 가능한 위치 제공자 알고 싶다면? ] LocationManagergetProviders() 함수 이용

 3) 위치 정보 얻기

      [위치 한 번만가져오기]

-LocationManagergetLastKnownLocaion() 함수 이용

-이 함수 반환값은 ‘Location 객체(, null 이면 위치 획득 실패)

-Location 객체 : 내부에 위치 정확도/위도/경도/획득시간 등의 데이터 포함 객체

getAccuracy() 위치 정확도 얻기
getLatitude() 위도 얻기
getLongitude 경도 얻기
getTime() 획득 시간 얻기

      ⓑ [위치 ‘계속’ 가져오기]

- LocationListener 구현 객체를

LocationManagerrequestLocationUpdates() 함수로 등록

- 더 이상 필요 없으면 removeUpdated() 함수로 해제

          <LocationListener> 내부 함수들

onLocationChanged() 새로운 위치 가져오면 호출됨
onProviderEnabled() 위치 제공자가 이용 O -> 호출됨
onProviderDisabled() 위치 제공자가 이용 X -> 호출됨

[구글 Play 서비스의 위치 라이브러리 사용]

- Fused Location Provider 라이브러리 사용

- 이 라이브러리 사용 준비 : build,gradle dependencies 항목으로 사용 등록

implementation ‘com.google.android.gms:play-service:12.0.1;

       <Fused Location Provide 의 핵심 클래스>

FusedLocationProviderClient 위치 정보 얻음
GoogleApiClient 위치 제공자 준비 등 다양한 콜백 제공

-GoogleApiClient에서 위치 정보 제공자 결정하면                                                                                                                        이를 이용해서 FusedLocationProviderClient에서 위치를 가져오는 구조

1) GoogleApiClient 초기화
2) FusedLocationProviderClient 초기화
3) GoogleApiClient 객체에 connect() 함수로 위치 제공자 요청
4) 사용자 위치 얻기 : onConnected() 호출하여
            내부의 FusedLocationProviderClientgetLastLocation() 함수 호출함

[19-2. 구글 지도 활용]

   -지도 서비스 제공 업체의 API 이용하여 지도 출력 O

   -여기서는 구글 지도이용

[지도 사용 설정]

 ① build.gradle 에 구글 지도 사용 선언

implementation ‘com.google.android.gms:play-services:12.0.1;

 ② 매니페스트에 퍼미션 등록

-구글 지도: 구글 서버에서 전송되는 데이터이므로 네트워크 통신 권한도 등록 필요

<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>
<uses-permission android:name=“android.permission.INTERNET”/>
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>

 ③ 매니페스트에 구글 지도 API 키 등록

<application ...
   <uses-library android:name=“org.apache.http.legacy”android:required= “false”/>
   <meta-data android:name=“com.google.android.maps.v2.API_KEY”
       android:value=“###구글 지도 API 키 등록###”/>
   <meta-data android:name=“com.google.android:gms.version”
       android:value=“@integer/google_play_services_version”/>
</application>

[구글 개발자 콘솔에서 지도 API 키 얻기]

-구글 개발자 콘솔(console.cloud.google.com)에 접속하여 프로젝트 생성하고 사용자 인증정보 만들면 지도 API 키 발급 가능O

-매니페스트 파일에 <meta-data>태그의 value 속성값으로 발급받은 지도 API 키 등록

   <레이아웃 XML>

-play-services 라이브러리에서 지도를 프래그먼트로 제공해주므로  지도 출력할 화면에 프래그먼트 등록

 

[지도 제어하기]

  -기본 위치 = 아프리카 대륙

   <지도의 중심 이동>

   1) 지도 출력 뷰 객체 얻기

- onMapReadyCallback 구현 객체를 SupportMapFragmentgetMapAsync()함수에 전달.

-지도 객체 이용 가능할 때, onMapReady() 함수 자동 호출되면서 매개변수로 GoogleMap 객체 전달해줌

   2) 지도의 중심이동

- 지도 한 지점의 위도/경도를 LatLng 객체로 표현함

- CameraPosition 객체의 target() 함수로 위치 지정. zoom() 함수로 확대수준 지정

- 이 객체를 GoogleMap 객체의 moveCamera()에 전달

 

   <마커 표시하기>

-Bitmap객체로 표현 or 개발자 준비 이미지 or ply-services 제공 이미지 이용

-MarkerOptions 객체에 마커 정보담은 후, 이 객체를 GoogleMapaddMarker()에 전달

val markerOptions = MarkerOptions()
markerOptions.icon(...) // 출력할 이미지 지정
markerOptions.position( ..) //출력할 위치 지정
markerOptions.title(“ .. ” ) //도움말 표시 정보 지정
markerOptions.snippet(“...”)

googleMap?.addMarker(markerOptions) //마커 정보 객체를 전달
 

   <지도에서 사용자 이벤트 처리>

-사용자 이벤트 처리 인터페이스

GoogleMap.OnMapCLickListener 지도 클릭 이벤트
GoogleMap.OnMapLongClickListener 지도 롱 클릭 이벤트
GoogleMap.OnMarkerClickListener 마커 클릭 이벤트
GoogleMap.OnMarkerDragListener 마커 드래그 이벤트
GoogleMap.OnInfoWindowClickListener 정보 창 클릭 이벤트
GoogleMap.OnCameraIdleListener 지도 화면 변경 이벤트
 

[19-3. 구글 지도 앱 만들기] : 실습

[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 

728x90