Wear OS용 Google 어시스턴트

시계 음성 어시스턴트는 빠르고 효율적인 이동 중 시나리오를 지원합니다. 웨어러블 기기의 음성 상호작용은 동적입니다. 즉, 사용자는 기기를 보지 않고도 손목에 대고 말하면서 응답을 기다릴 수 있습니다.

어시스턴트 앱 작업을 통해 Android 개발자는 Wear OS 앱을 Google 어시스턴트로 확장할 수 있으므로 사용자를 "Hey Google, ExampleApp에서 달리기 시작해 줘"와 같은 음성 명령으로 앱으로 빠르게 전달할 수 있습니다.

제한사항

Wear의 어시스턴트는 미디어 및 운동 추적 활동 상호작용을 지원합니다. 미디어 앱을 어시스턴트와 통합하는 방법에 관한 안내는 Google 어시스턴트 및 미디어 앱을 참고하세요. Wear OS 앱에서는 다음과 같은 건강/피트니스 BII가 지원됩니다.

작동 방식

앱 작업은 앱 기능을 어시스턴트로 확장하여 사용자가 음성으로 앱 기능에 빠르게 액세스할 수 있도록 합니다. 사용자가 어시스턴트에 앱을 사용하겠다고 표현하면 어시스턴트는 앱의 shortcuts.xml 리소스에서 앱에 등록된 앱 작업을 찾습니다.

앱 작업은 Android 기능 요소와 함께 shortcuts.xml에 설명되어 있습니다. 기능 요소는 앱 기능의 시맨틱 설명인 내장 인텐트(BII)를 딥 링크 템플릿과 같은 처리 명령과 페어링합니다. Google Play Console을 사용하여 앱을 업로드하면 Google에서는 shortcuts.xml에 선언된 기능을 등록하여 사용자가 어시스턴트에서 트리거하는 데 사용할 수 있도록 합니다.

앱 작업 흐름

위 다이어그램은 사용자가 독립형 앱에서 운동을 일시중지하는 것을 보여줍니다. 이후 단계는 다음과 같습니다.

  1. 사용자가 어시스턴트에 특정 웨어러블 앱을 음성으로 요청합니다.
  2. 어시스턴트는 요청을 선행 학습된 모델(BII)과 일치시키고 BII에서 지원하는, 쿼리에서 발견된 모든 매개변수를 추출합니다.
  3. 이 예에서 어시스턴트는 쿼리를 PAUSE_EXERCISE BII에 일치시키고 운동 이름 매개변수 'hike'를 추출합니다.
  4. 앱은 이 BII의 shortcuts.xml 기능 처리 정의를 통해 트리거됩니다.
  5. 앱은 처리를 실행하여 운동을 일시중지합니다.

연결

앱 작업 개발은 Android 지원 기기 생태계에서 앱의 기능에 따라 달라집니다.

  • 테더링: 웨어러블 앱이 전체 기능을 위해 모바일 앱에 종속되는 경우 시계를 통해 어시스턴트에 보낸 사용자 쿼리는 휴대기기에서 처리됩니다. 이 시나리오가 올바르게 작동하려면 앱 작업 처리 로직을 모바일 앱에 빌드해야 합니다.

  • 테더링되지 않음: 웨어러블 앱이 모바일 앱과 별개로 작동하는 경우 어시스턴트는 시계에서 로컬로 사용자 쿼리를 처리합니다. 이러한 요청이 제대로 처리되려면 앱 작업 기능이 웨어러블 앱에 빌드되어야 합니다.

Wear에 음성 기능 추가

다음 단계에 따라 앱 작업을 Wear OS 앱과 통합하세요.

  1. 음성을 사용 설정할 인앱 기능을 해당하는 BII에 일치시킵니다.
  2. 기본 활동 AndroidManifest.xml 리소스에서 Android 바로가기 지원을 선언합니다.

    <!-- AndroidManifest.xml -->
    <meta-data
        android:name="android.app.shortcuts"
        android:resource="@xml/shortcuts" />
    
  3. AndroidManifest.xml에 <intent-filter> 요소를 추가합니다. 이렇게 하면 어시스턴트가 딥 링크를 사용하여 앱 콘텐츠에 연결할 수 있습니다.

  4. shortcuts.xml을 만들어 BII의 처리 세부정보를 제공합니다. capability 바로가기 요소를 사용하여 앱에서 지원하는 BII를 어시스턴트에 선언합니다. 자세한 내용은 기능 추가를 참고하세요.

  5. shortcuts.xml에서, 선택된 BII의 기능을 구현합니다. 다음 샘플은 START_EXERCISE BII의 기능을 보여줍니다.

    <?xml version="1.0" encoding="utf-8"?>
    <!-- This is a sample shortcuts.xml -->
    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
      <capability android:name="actions.intent.START_EXERCISE">
        <intent
          android:action="android.intent.action.VIEW"
          android:targetPackage="YOUR_UNIQUE_APPLICATION_ID"
          android:targetClass="YOUR_TARGET_CLASS">
          <!-- Eg. name = "Running" -->
          <parameter
            android:name="exercise.name"
            android:key="name"/>
          <!-- Eg. duration = "PT1H" -->
          <parameter
            android:name="exercise.duration"
            android:key="duration"/>
        </intent>
      </capability>
    </shortcuts>
    
  6. 해당하는 경우 앱의 기능과 콘텐츠를 나타내는 인라인 인벤토리를 사용하여 사용자 음성 변형 지원을 확장합니다.

    <capability android:name="actions.intent.START_EXERCISE">
      <intent
        android:targetPackage="com.example.myapp"
        android:targetClass="com.example.myapp.ExerciseActivity">
        <parameter android:name="exercise.name" android:key="exercise" />
      </intent>
    </capability>
    
    <shortcut android:shortcutId="CARDIO_RUN">
      <capability-binding android:key="actions.intent.START_EXERCISE">
        <parameter-binding
          android:key="exercise.name"
          android:value="@array/run_names" />
        </capability-bindig>
    </shortcut>
    
  7. 수신되는 앱 작업 처리를 실행하도록 앱의 로직을 업데이트합니다.

    //FitMainActivity.kt
    
    private fun handleIntent(data: Uri?) {
        var actionHandled = true
        val startExercise = intent?.extras?.getString(START_EXERCISE)
    
        if (startExercise != null){
            val type = FitActivity.Type.find(startExercise)
            val arguments = Bundle().apply {
                putSerializable(FitTrackingFragment.PARAM_TYPE, type)
            }
            updateView(FitTrackingFragment::class.java, arguments)
        }
        else{
            showDefaultView()
            actionHandled = false
        }
        notifyActionSuccess(actionHandled)
    }
    

앱 미리 보기, 테스트, 게시

앱 작업은 앱을 검토하고 테스트하는 도구를 제공합니다. 자세한 내용은 Android 스튜디오용 Google 어시스턴트 플러그인을 참고하세요. 앱을 테스트하고 테스트 버전을 만들면 앱 작업 검토를 요청하고 배포할 수 있습니다. 일반적인 오류를 처리하는 방법에 관한 안내는 다음 권장사항을 참고하세요.

권장사항

어시스턴트와 앱을 통합할 때 다음 권장사항에 따라 긍정적인 사용자 환경을 만드세요.

햅틱 및 오디오 확인과 함께 해당 또는 관련 확인 화면을 표시하여 사용자 요청에 응답하세요. 요청을 성공적으로 처리하거나 오류를 알립니다.

기본 품질 고품질 최고품질
  • 활동에서 ConfirmationActivity를 시작하는 인텐트를 만듭니다.
  • 활동에서 ConfirmationActivity를 시작하는 인텐트를 만듭니다.
  • 차임벨 및 햅틱 반응을 재생하여 현재 상태를 나타냅니다.
  • 활동에서 ConfirmationActivity를 시작하는 인텐트를 만듭니다.
  • 텍스트 음성 변환(TTS) 및 햅틱 반응으로 오류 또는 성공을 나타냅니다.

일반적인 오류 및 해결 방법

다음 오류 사례에는 다음과 같은 권장되는 앱 ConfirmationActivity 메시지를 사용하세요.

오류 사례 사용자 상호작용 예 앱 응답
이미 진행 중인 활동임 "ExerciseName 시작"
"ExerciseName 재개"
오류 표시: 이미 진행 중인 활동임'
시작된 활동 없음 "ExerciseName 일시중지/중지" 오류 표시: '시작된 활동 없음'
활동 유형 불일치 진행 중인 활동과 다른 운동 유형인 'ExerciseName' 일시중지/중지' 오류 표시: '활동 유형 불일치'
로그인 오류 사용자가 앱에 로그인하지 않았을 때 '내 ExerciseName 시작' 햅틱을 재생하여 사용자에게 알리고 로그인 화면으로 리디렉션합니다.
권한 오류 사용자에게 요청한 활동을 시작할 권한이 없습니다. 햅틱을 재생하여 사용자에게 알리고 권한 요청 화면으로 리디렉션합니다.
센서 문제 사용자가 기기 설정에서 위치 서비스를 사용 중지했습니다. 햅틱을 재생하여 사용자에게 알리고 센서 오류 화면을 표시합니다. 다음 단계(선택사항):
  • 센서 추적 없이 활동을 시작하고 사용자에게 알립니다.
  • 센서 추적 없이 활동을 시작하려면 사용자 확인을 요청하세요.