Wear OS에서 위치 감지

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

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

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

시계상의 위치 데이터를 가져오기 위한 권장되는 방법은 FLP(Fused Location Provider)입니다. 또한 이 문서에서는 시계상의 위치 센서를 확인하고, 위치 데이터를 수신하고, 테더링된 데이터 연결을 모니터링하는 방법에 대해 설명합니다. iPhones에 페어링된 시계의 위치 데이터도 참조하세요.

위치 데이터를 가져오는 동작이 배터리 수명에 미치는 부정적인 영향을 줄이려면, PRIORITY_BALANCED_POWER_ACCURACY로 설정된 setPriority()를 앱이 호출하도록 해야 합니다. setInterval()을 사용하는 경우 1분에 한 번 이상의 빈도로 위치를 요청해서는 안 됩니다.

참고: 이 문서에서는 여러분이 Google Play 서비스 API를 사용하여 위치 데이터를 검색하는 방법을 알고 있다고 가정합니다.

FLP(Fused Location Provider) 사용

시계에서 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)

Java

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 센서가 없는 경우, 전화에 테더링된 데이터 연결이 끊기자마자 이 시계의 위치 데이터 스트림이 갑자기 끊어집니다. 앱에서 일정한 데이터 스트림을 기대하는 경우, 이 앱이 연결 끊김을 감지하고, 사용자에게 경고하고, 해당 기능을 적절히 디그레이드해야 합니다.

테더링된 데이터 연결이 끊긴 것을 감지하려면 NodeApi GetConnectedNodesResult 메서드를 사용합니다. 예:

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

    Java

    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")
    }
    

    Java

    @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가 없고 휴대폰과의 연결이 끊긴 경우에 유용합니다. 자세한 내용은 마지막으로 알려진 위치 가져오기를 참조하세요.