사용자 위치 확인

사용자의 위치를 찾고, 변경된 위치 정보를 기반으로 지도에 표현할 수 있는 기능에 대해 설명합니다.

위치 데이터 사용

위치 권한 설정

위치 기능을 사용하기 위해서는 아래와 같이 AndroidManifest.xmlACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 권한을 명시해야 합니다.

<manifest>
...
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
...
</manifest>

LocationProvider

LocationProvider는 사용자의 위치를 제공하는 인터페이스입니다. InaviMap 객체의 locationProvider 속성을 설정하여 사용자의 위치를 제공받을 수 있습니다. 설정된 LocationProvideractivate(), deactivate() 함수는 InaviMap 내부에서 상황에 따라 호출합니다.

FusedLocationProvider

FusedLocationProvider는 저전력으로 GPS 외에 센서 등을 활용하여 정확도가 높은 위치를 제공합니다. FusedLocationProvider는 내부에서 위치 권한을 요청하도록 구현되어 있기 때문에 생성자에 Activity 또는 Fragment 객체를 전달하고, OnPermissionResultCallback 콜백으로 권한 요청에 대한 결과를 받을 수 있습니다.

class LocationActivity : AppCompatActivity(), OnMapReadyCallback {
    companion object {
        private const val LOCATION_PERMISSION_REQUEST_CODE = 10000
    }

    private val locationProvider by lazy {
         FusedLocationProvider(this) { isGranted ->
             // 권한 요청 결과 처리
         }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        mapFragment.getMapAsync(this)
        ...
    }

    override fun onMapReady(inaviMap: InaviMap) {
        inaviMap.locationProvider = locationProvider
        inaviMap.uiSettings.isLocationButtonVisible = true // 위치 버튼 표출
    }
}

위치 추적 모드

InaviMap 객체에 locationProvider 속성을 설정한 다음, 사용자가 위치 권한 사용을 승인하면 위치 추적 기능을 사용할 수 있습니다. userTrackingMode 속성을 설정하거나 현위치 버튼을 클릭하여 위치 추적 모드를 변경할 수 있습니다.

// 현위치 버튼 표출
inaviMap.uiSettings.isLocationButtonVisible = true

// 위치 추적 모드 `Tracking` 모드로 설정
inaviMap.userTrackingMode = UserTrackingMode.Tracking

위치 추적 모드의 종류는 아래와 같으며, UserTrackingMode 열거형에 정의되어 있습니다.

  • None

    위치 추적을 비활성화 합니다.

  • NoTracking

    위치 추적이 활성화 되며, 사용자의 위치에 맞춰 위치 아이콘의 위치가 변경됩니다.

  • Tracking

    위치 추적이 활성화 되며, 사용자의 위치에 맞춰 위치 아이콘의 위치와 카메라의 좌표가 변경됩니다.

    API 호출 또는 제스처 사용으로 카메라가 변경되면 NoTracking으로 변경됩니다.

  • TrackingCompass

    위치 추적이 활성화 되며, 사용자의 위치와 방향에 맞춰 위치 아이콘의 위치와 카메라의 좌표, 베어링 각도가 변경됩니다. API 호출 또는 제스처 사용으로 카메라가 변경되면 NoTracking으로 변경됩니다.

위치 변경 이벤트

InaviMap#addOnLocationChangedListener() 메서드를 호출하여 위치 변경 리스너를 추가하면 위치 변경에 대한 이벤트를 감지할 수 있습니다. 위치 추적이 활성화된 다음, 사용자의 위치가 변경되면 onLocationChanged() 콜백 함수로 변경된 사용자의 위치가 전달됩니다.

inaviMap.addOnLocationChangedListener { location ->
    Toast.makeText(context, "변경된 좌표 : " +
            "(${location?.latitude}, ${location?.longitude})",
        Toast.LENGTH_SHORT).show()
}

Last updated