Wear OS에서 위치 감지

한눈에 파악이 가능한 시계의 작은 폼 팩터 덕분에 Wear OS by Google은 사용자 위치를 기록하고 보고하고 응답하는 앱에 가장 적합한 플랫폼입니다. 예를 들어, 사용자에게 거리, 속도, 방향에 관한 실시간 업데이트를 제공하는 앱을 빌드하거나 사용자의 주변 환경을 한눈에 파악할 수 있는 대기열을 제공하는 앱을 빌드할 수 있습니다.

다음의 관련 리소스를 참조하세요.

일부 시계에는 테더링된 휴대전화가 없어도 위치 데이터를 검색하는 GPS 센서가 내장되어 있습니다. 사용자가 시계 앱에서 위치 데이터를 요청하는 경우 이 위치 데이터의 출처가 어디인지 걱정할 필요가 없으며, 시스템에서는 전력을 가장 효율적으로 사용하여 데이터를 가져옵니다. 그러나 아래 섹션에 설명된 것처럼, 앱에서 위치 데이터의 손실을 처리해야 합니다.

시계에서 위치 데이터를 가져올 때 권장하는 방법은 FLP(통합 위치 정보 제공자)를 사용하는 것입니다. 또한 이 문서에서는 어떻게 시계의 위치 센서를 확인하고, 위치 데이터를 수신하고, 테더링된 데이터 연결을 모니터링하는지를 설명합니다. iPhones에 페어링된 시계의 위치 데이터도 참조하세요.

위치 데이터를 가져올 때 배터리 수명에 미치는 부정적인 영향을 줄이려면 앱에서 PRIORITY_BALANCED_POWER_ACCURACY로 설정된 setPriority()를 호출해야 합니다. 또한 setInterval()을 사용해 1분에 한 번 이상 위치를 요청하지 않아야 합니다.

참고: 이 문서는 Google Play 서비스 API를 사용해 위치 데이터를 검색하는 방법을 알고 있는 사용자를 대상으로 합니다.

FLP(통합 위치 정보 제공자) 사용

시계에서는 FusedLocationProviderApi(FLP)를 사용하여 위치 데이터를 가져와야 합니다. 시계에 GPS 센서가 없는 경우 FLP는 자동으로 휴대전화의 위치 데이터를 사용합니다. 자세한 내용은 위치 서비스 클라이언트 생성을 참조하세요.

위치 업데이트 요청과 연속적인 사용자 위치 추적에 관한 내용은 위치 업데이트 수신을 참조하세요.

온보드 GPS 감지

사용자가 내장 GPS 센서가 없는 시계를 착용하고 조깅을 하는데 이 시계와 페어링된 휴대전화를 두고 나온 경우, 시계 앱은 테더링된 연결을 통해 위치 데이터를 가져올 수 없습니다. 앱은 이 상황을 감지하고 위치 기능을 사용할 수 없다고 사용자에게 경고해야 합니다.

시계에 내장 GPS 센서가 있는지 확인하려면 hasSystemFeature() 메서드를 사용합니다. 다음 코드는 활동을 시작할 때 시계에 내장 GPS 센서가 있는지 감지합니다.

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (!hasGps()) {
            Log.d(TAG, "This hardware doesn't have GPS.")
            // Fall back to functionality that does not use location or
            // warn the user that location function is not available.
        }
    }

    private fun hasGps(): Boolean =
            packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)
    

자바

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        if (!hasGps()) {
            Log.d(TAG, "This hardware doesn't have GPS.");
            // Fall back to functionality that does not use location or
            // warn the user that location function is not available.
        }

        ...
    }

    private boolean hasGps() {
        return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
    }
    

연결 끊김 이벤트 처리

시계에 내장 GPS 센서가 없는 경우 테더링된 휴대전화와 데이터 연결이 끊기면 이 시계의 위치 데이터 스트림이 갑자기 중단됩니다. 앱에서 일관된 데이터 스트림을 기대한다면 연결 중단을 감지하고, 사용자에게 경고하며, 위치 기능의 성능을 단계적으로 저하해야 합니다.

테더링된 데이터 연결의 중단을 감지하려면 NodeApiGetConnectedNodesResult 메서드를 사용합니다. 예:

  1. GoogleApiClient를 초기화하고 NodeApi를 호출하는 메서드(예: inspectNodes)를 만듭니다.

    Kotlin

        private lateinit var googleApiClient: GoogleApiClient
        private var wearableConnected = false
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            googleApiClient = GoogleApiClient.Builder(this)
                    .addApi(Wearable.API)
                    .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                        override fun onConnected(connectionHint: Bundle?) {
                            inspectNodes()
                        }
    
                        override fun onConnectionSuspended(cause: Int) {}
                    })
                    .build()
    
        }
    
        private fun inspectNodes() {
            Wearable.NodeApi
                    .getConnectedNodes(googleApiClient)
                    .setResultCallback(this, 1000, TimeUnit.MILLISECONDS)
        }
        

    자바

        private GoogleApiClient googleApiClient;
        private boolean wearableConnected = false;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            googleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(Wearable.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle connectionHint) {
                            inspectNodes();
                        }
    
                        @Override
                        public void onConnectionSuspended(int cause) {
                        }
                    })
                    .build();
        }
    
        private void inspectNodes(){
            Wearable.NodeApi.getConnectedNodes(googleApiClient).setResultCallback(this, 1000, TimeUnit.MILLISECONDS);
        }
        
  2. 다음 콜백 메서드를 사용해 inspectNodes 메서드의 사용 결과를 가져옵니다.

    Kotlin

        override fun onResult(getConnectedNodesResult: NodeApi.GetConnectedNodesResult) {
            wearableConnected = false
            getConnectedNodesResult.nodes.forEach { node ->
                wearableConnected = wearableConnected or node.isNearby
            }
            Log.v("TEST", "wearableConnected: $wearableConnected")
        }
        

    자바

        @Override
        public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
            if (getConnectedNodesResult != null && getConnectedNodesResult.getNodes() != null){
                wearableConnected = false;
                for (Node node : getConnectedNodesResult.getNodes()){
                    if (node.isNearby()){
                        wearableConnected = true;
                    }
                }
            }
            Log.v("TEST", "wearableConnected: " + wearableConnected);
        }
        

찾을 수 없는 위치 처리

GPS 신호가 중단되면 사용자 시계에 마지막으로 알려진 위치를 검색할 수 있습니다. 마지막으로 알려진 위치 검색은 GPS 업데이트 위치를 가져올 수 없거나 시계에 내장 GPS가 없고 휴대전화와의 연결이 중단된 경우에 유용합니다. 자세한 내용은 마지막으로 알려진 위치 가져오기를 참조하세요.