위치 설정 변경

앱에서 위치를 요청하거나 권한 업데이트를 수신해야 한다면 기기는 GPS 또는 Wi-Fi 검색과 같은 적절한 시스템 설정을 사용해야 합니다. 앱에서 서비스(예: 기기의 GPS)를 직접 사용 설정하기보다는 필요한 수준의 정확도/전력 소비 및 원하는 업데이트 간격을 지정하고 기기는 시스템 설정을 자동으로 적절하게 변경합니다. 이러한 설정은 LocationRequest 데이터 객체에서 정의합니다.

이 과정에서는 설정 클라이언트를 사용하여 어떤 설정이 사용되는지 확인하고 위치 설정 대화상자를 제공하여 사용자가 탭 한 번으로 설정을 업데이트하는 방법을 보여줍니다.

위치 서비스 구성

Google Play 서비스와 통합 위치 정보 제공자에서 제공하는 위치 서비스를 사용하려면 설정 클라이언트를 사용하여 앱을 연결한 다음 현재 위치 설정을 확인하고 필요한 경우 사용자에게 필요한 설정을 사용 설정하라는 메시지를 표시합니다.

위치 서비스를 사용하는 앱은 위치 정보 액세스 권한을 요청해야 합니다. 이 과정에서는 대략적 위치 감지로 충분합니다. 다음 예와 같이 앱 매니페스트의 uses-permission 요소를 사용하여 이 권한을 요청합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.google.android.gms.location.sample.locationupdates" >

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

기기에서 Android 6.0 이상을 실행하고 앱의 타겟 SDK가 23 이상이면 앱은 매니페스트에 권한을 나열하고 런타임에 이러한 권한을 요청해야 합니다. 자세한 내용은 런타임 시 권한 요청을 참조하세요.

앱에서 Android 10(API 수준 29) 이상을 타겟팅하고 앱이 백그라운드에 있는 동안 기기 위치에 액세스해야 하는 경우 ACCESS_BACKGROUND_LOCATION 권한도 선언해야 합니다. 자세한 내용은 백그라운드 위치에 액세스 요청 방법에 관한 섹션을 참조하세요.

참고: 앱이 백그라운드에서 실행될 때 앱의 타겟 SDK 버전과 상관없이 위치 액세스는 앱의 핵심 기능에 중요한 역할을 하며 사용자에게 적절하게 공개됩니다.

앱이 사용자에게 표시되거나 포그라운드 서비스 내에 있는 동안 대부분의 위치 기반 사용 사례를 처리할 수 있습니다. 이러한 상황에서 위치를 요청하여 사용자에게 더 나은 투명성과 제어 기능을 제공할 수 있습니다.

위치 요청 설정

통합 위치 정보 제공자에 관한 요청의 매개변수를 저장하려면 LocationRequest를 만듭니다. 매개변수는 위치 요청의 정확도 수준을 결정합니다. 사용 가능한 위치 요청 옵션에 관한 자세한 내용은 LocationRequest 클래스 참조를 확인하세요. 이 과정에서는 아래 설명한 대로 업데이트 간격, 가장 빠른 업데이트 간격 및 우선순위를 설정합니다.

업데이트 간격
setInterval() - 이 메서드는 앱에서 선호하는 위치 업데이트 수신 간격을 밀리초 단위로 설정합니다. 위치 업데이트는 배터리 사용량을 최적화하기 위해 설정된 간격보다 다소 빠르거나 느릴 수 있고 아예 업데이트가 없을 수도 있습니다(예: 기기가 연결되어 있지 않은 경우).
가장 빠른 업데이트 간격
setFastestInterval() - 이 메서드는 앱이 위치 업데이트를 처리할 수 있는 가장 빠른 간격을 밀리초 단위로 설정합니다. 앱이 setInterval()에 지정된 간격보다 빠르게 업데이트를 수신하는 경우가 아니라면 이 메서드를 호출할 필요가 없습니다.
우선순위

setPriority() - 이 메서드는 요청의 우선순위를 설정하여 Google Play 서비스 위치 서비스에 사용할 위치 소스에 관한 강력한 힌트를 제공합니다. 지원되는 값은 다음과 같습니다.

  • PRIORITY_BALANCED_POWER_ACCURACY - 이 설정을 사용하여 도시 블록 내의 위치 정밀도를 요청합니다. 정확도는 대략 100미터입니다. 이는 대략적인 수준의 정확도로 간주되며 전력을 더 적게 소비할 수 있습니다. 이 설정을 사용하면 위치 서비스에서 Wi-Fi와 셀 타워 위치를 사용할 수 있습니다. 그러나 위치 정보 제공자의 선택은 사용할 수 있는 소스 등 다른 많은 요소에 따라 달라집니다.
  • PRIORITY_HIGH_ACCURACY - 이 설정을 사용하여 가장 정확한 위치를 요청합니다. 이 설정을 사용하면 위치 서비스가 GPS를 사용하여 위치를 확인할 가능성이 높습니다.
  • PRIORITY_LOW_POWER - 이 설정을 사용하여 도시 수준의 정밀도를 요청합니다. 대략 10킬로미터의 정확도입니다. 이는 대략적인 수준의 정확도로 간주되며 전력을 더 적게 소비할 수 있습니다.
  • PRIORITY_NO_POWER - 전력 소비에 별다른 영향을 미치지 않으면서 사용 가능한 경우 위치 업데이트를 수신하려면 이 설정을 사용합니다. 이 설정을 사용하면 앱에서 위치 업데이트를 트리거하지 않고 다른 앱에서 트리거한 위치를 수신합니다.

다음 코드 샘플과 같이 위치 요청을 만들고 매개변수를 설정하세요.

Kotlin

    fun createLocationRequest() {
        val locationRequest = LocationRequest.create()?.apply {
            interval = 10000
            fastestInterval = 5000
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        }
    }
    

자바

    protected void createLocationRequest() {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(5000);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
    

앱 매니페스트에서 정의한 ACCESS_FINE_LOCATION 권한 설정과 5,000밀리초(5초)의 빠른 업데이트 간격을 결합한 PRIORITY_HIGH_ACCURACY의 우선순위는 통합 위치 정보 제공자가 몇 피트 이내의 정확한 위치 업데이트를 반환하도록 합니다. 이 방법은 실시간으로 위치를 표시하는 앱을 매핑하는 데 적합합니다.

성능 힌트: 위치 업데이트를 수신한 후 앱에서 네트워크에 액세스하거나 다른 장기 실행 작업을 하는 경우 가장 빠른 간격을 더 느린 값으로 조정하세요. 이 조정은 앱이 사용할 수 없는 업데이트를 받지 못하게 합니다. 장기 실행 작업이 완료되면 가장 빠른 간격을 다시 빠른 값으로 설정합니다.

현재 위치 설정 받기

Google Play 서비스 및 위치 서비스 API에 연결하면 사용자 기기의 현재 위치 설정을 받을 수 있습니다. 이렇게 하려면, LocationSettingsRequest.Builder를 만들고 하나 이상의 위치 요청을 추가합니다. 다음 코드 스니펫은 이전 단계에서 만들어진 위치 요청을 추가하는 방법을 보여줍니다.

Kotlin

    val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)
    

자바

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
         .addLocationRequest(locationRequest);
    

다음은 현재 위치 설정이 충족되었는지 확인합니다.

Kotlin

    val builder = LocationSettingsRequest.Builder()

    // ...

    val client: SettingsClient = LocationServices.getSettingsClient(this)
    val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
    

자바

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

    // ...

    SettingsClient client = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
    

Task가 완료되면 앱에서 LocationSettingsResponse 객체의 상태 코드로 위치 설정을 확인할 수 있습니다. 관련 위치 설정의 현재 상태에 관해 더 자세히 알아보려면 앱에서 LocationSettingsResponse 객체의 getLocationSettingsStates() 메서드를 호출하면 됩니다.

사용자에게 위치 설정 변경을 요청하는 메시지 표시

위치 설정이 위치 요청에 적합한지 확인하려면 위치 설정을 확인하는 Task 객체에 OnFailureListener를 추가합니다. 그런 다음 onFailure() 메서드에 전달된 Exception 객체가 ResolvableApiException 클래스의 인스턴스인지 확인합니다. 이 클래스는 설정을 변경해야 함을 나타내는 클래스입니다. 이제 startResolutionForResult() 호출을 통해 사용자에게 위치 설정을 수정할 수 있는 권한을 요청하는 대화상자를 표시합니다.

다음 코드 스니펫은 사용자의 위치 설정을 사용하여 위치 서비스에서 LocationRequest를 만들지 결정하는 방법과 필요한 경우 사용자에게 위치 설정 변경 권한을 요청하는 방법을 보여줍니다.

Kotlin

    task.addOnSuccessListener { locationSettingsResponse ->
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }

    task.addOnFailureListener { exception ->
        if (exception is ResolvableApiException){
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                exception.startResolutionForResult(this@MainActivity,
                        REQUEST_CHECK_SETTINGS)
            } catch (sendEx: IntentSender.SendIntentException) {
                // Ignore the error.
            }
        }
    }
    

자바

    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...
        }
    });

    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
    

다음 과정인 위치 업데이트 수신에서는 주기적 위치 업데이트 수신 방법을 보여줍니다.