본문 바로가기
안드로이드/공부 및 정리

[Android]accompanist-permissions을 사용한 권한 요청과 GPS를 이용한 위치 추적

by 디선 2024. 9. 9.

마이그레이션 도중 추후를 위해 정리 필요성을 느낌


1. gradle 설정

gps 를 위한 코드와 permission 체크를 위한 gradle을 설정한다

permission 체크는 accompanist-permissions를 이용할 것이다

version-catalog를 설정해준다

google-location = "21.3.0"
accompanist-permissions = "0.36.0"

google-location = {module = "com.google.android.gms:play-services-location",version.ref = "google-location"}
accompanist-permissions = {module = "com.google.accompanist:accompanist-permissions",version.ref = "accompanist-permissions"}

그후 gradle에 추가해준다

    implementation(libs.google.location)
    implementation(libs.accompanist.permissions)

2. Manifest 추가

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

위치를 찾아주는 퍼미션을 추가해준다

3. 권한 요청

val multiplePermissionsState = rememberMultiplePermissionsState(
        permissions = listOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )

when {
    multiplePermissionsState.allPermissionsGranted -> {
        LaunchedEffect(Unit){}
    }
    multiplePermissionsState.shouldShowRationale -> {}
    else -> {
        LaunchedEffect(Unit) {
            multiplePermissionsState.launchMultiplePermissionRequest()
        }
    }
}
  • allPermissionGranted : 모든 권한이 허용된 경우에 처리할 로직을 작성한다
  • shouldShowRationale : 사용자가 권한을 거부했을 때, 왜 권한이 필요한지 설명한다
  • launchMultiplePermissionReques : 권한 요청을 실행한다

4. GPS 추적

위치 정보를 추적하기 위해 FusedLocationProviderClient를 사용하여 고정밀도 위치 업데이트를 요청합니다.

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(10000)
            .build()

        val locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                val location = locationResult.lastLocation
                location?.let {
                    fusedLocationClient.removeLocationUpdates(this)
                }
            }
        }

        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
  • LocationRequest.Builder: 10초 주기로 고정밀도 위치 업데이트 요청을 설정한다
  • locationCallback: 위치가 업데이트되면 호출되는 콜백 함수다
  • fusedLocationClient.removeLocationUpdates(this): 위치 업데이트를 중지한다. 지속적인 업데이트가 필요하다면 이 부분을 제거한다.

그 후 location callback이 발생하면 위 코드를 통해 위치 업데이트를 중지한다. 만약 지속적으로 요청을 하고싶다면 위 코드를 삭제하면 된다

반응형