위치 설정 변경

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

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

위치 서비스 구성

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

위치 서비스를 사용하는 기능이 있는 앱은 이러한 기능의 사용 사례에 따라 위치 정보 액세스 권한을 요청해야 합니다.

위치 요청 설정

통합 위치 정보 제공자에 관한 요청의 매개변수를 저장하려면 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.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

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

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

현재 위치 설정 받기

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

Kotlin

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

Java

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())

Java

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.
        }
    }
}

Java

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.
            }
        }
    }
});

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