위치 설정 변경

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

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

위치 서비스 구성

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

위치 서비스를 사용하는 앱은 위치 정보 액세스 권한을 요청해야 합니다. 이 과정에서는 대략적 위치 감지로 충분합니다. 다음 예와 같이 앱 manifest의 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 이상이면 앱은 manifest에 권한을 나열하 런타임에 이러한 권한을 요청해야 합니다. 자세한 내용은 런타임 시 권한 요청을 참조하세요.

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

위치 요청 설정

통합 위치 정보 제공업체에 요청 매개변수를 저장하려면 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);
    }
    

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

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

현재 위치 설정 받기

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() 메서드를 호출하면 됩니다.

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

위치 설정이 위치 요청에 적합한지 확인하려면 OnFailureListener를 위치 설정의 유효성을 검사하는 Task 개체에 추가합니다. 그런 다음 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.
                }
            }
        }
    });
    

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