어시스턴트의 상황별 콘텐츠 최적화

Android 6.0 Marshmallow에서는 사용자가 Google 어시스턴트와 같은 어시스턴트 앱을 통해 앱에 참여할 수 있는 새로운 방식을 제시합니다. 어시스턴트는 사용자가 현재 활동의 상황에 맞는 관련 작업을 가져오기 위해 볼 수 있는 최상위 창입니다. 이러한 작업에는 기기에 있는 다른 앱으로 연결되는 딥 링크가 포함될 수 있습니다.

사용자는 홈 버튼을 길게 누르거나 주요 구문을 말하여 어시스턴트를 활성화합니다. 이에 응답하여 시스템은 상황에 맞는 관련 작업을 표시하는 최상위 창을 엽니다.

Google 어시스턴트와 같은 어시스턴트 앱은 Android 플랫폼 수준 기능과 호환되는 Now on Tap 기능을 통해 어시스턴트 오버레이 창을 구현합니다. 시스템에서 사용자는 Android의 Assist API를 사용하여 앱에서 컨텍스트 정보를 가져오는 어시스턴트 앱을 선택할 수 있습니다.

이 가이드에서는 Android 앱이 Android의 Assist API를 사용하여 어시스턴트 사용자 환경을 개선하는 방법을 설명합니다. 미디어 앱을 만들어서 어시스턴트가 시작하고 제어할 수 있도록 하는 방법을 알아보려면 Google 어시스턴트 및 미디어 앱을 참고하세요.

어시스턴트 사용

그림 1은 어시스턴트와의 일반적인 사용자 상호작용을 보여줍니다. 사용자가 홈 버튼을 길게 누르면 소스 앱에서 Assist API 콜백이 호출됩니다(1단계). 어시스턴트가 오버레이 창을 렌더링하면(2단계 및 3단계) 사용자는 수행할 작업을 선택합니다. 어시스턴트는 (대상) 식당 앱으로 연결되는 딥 링크로 인텐트를 실행하는 것과 같이 선택된 작업을 실행합니다 (4단계).

그림 1. Google 앱의 Now on Tap 기능을 통한 어시스턴트 상호작용의 예

사용자는 설정 > 앱 > 기본 앱 > 지원 및 음성 입력을 선택하여 어시스턴트를 구성할 수 있습니다. 사용자는 그림 2와 같이 화면 콘텐츠에 텍스트로 액세스하고 스크린샷에 액세스하는 등의 시스템 옵션을 변경할 수 있습니다.

그림 2. 지원 및 음성 입력 설정

소스 앱

앱이 사용자에 관한 정보의 소스로 어시스턴트와 작동하도록 하려면 접근성 권장사항을 따라야 합니다. 이 섹션에서는 맞춤형 보기와 같은 특별한 처리가 필요한 시나리오와 더불어 어시스턴트 사용자 환경을 개선하는 데 도움이 되는 추가 정보를 제공하는 방법을 설명합니다.

어시스턴트와 추가 정보 공유

앱은 텍스트와 스크린샷 외에도 다른 정보를 어시스턴트와 공유할 수 있습니다. 예를 들어 음악 앱은 현재 앨범 정보를 전달하여 어시스턴트가 현재 활동에 맞는 더 스마트한 작업을 제안할 수 있도록 할 수 있습니다. Assist API는 미디어 컨트롤을 제공하지 않습니다. 미디어 컨트롤을 추가하려면 Google 어시스턴트 및 미디어 앱을 참고하세요.

어시스턴트에 추가 정보를 제공하기 위해 앱은 앱 리스너를 등록하여 전역 애플리케이션 컨텍스트를 제공하고 그림 3과 같이 활동 콜백을 통해 활동별 정보를 제공합니다.

그림 3. Assist API 수명 주기 시퀀스 다이어그램

전역 애플리케이션 컨텍스트를 제공하기 위해 앱은 Application.OnProvideAssistDataListener 구현을 만들고 registerOnProvideAssistDataListener()를 사용하여 등록합니다. 활동별로 상황에 맞는 정보를 제공하기 위해 활동은 onProvideAssistData()onProvideAssistContent()를 재정의합니다. 이 두 가지 활동 메서드는 선택적인 전역 콜백이 호출된 후에 호출됩니다. 콜백은 기본 스레드에서 실행되므로 즉시 완료해야 합니다. 콜백은 활동이 실행 중인 경우에만 호출됩니다.

맥락 제공

사용자가 어시스턴트를 활성화하면 AssistStructure 인스턴스로 표시된 현재 애플리케이션의 모든 컨텍스트와 함께 전체 ACTION_ASSIST 인텐트를 빌드하도록 onProvideAssistData()가 호출됩니다. 이 메서드를 재정의하여 원하는 것을 번들에 배치하면 지원 인텐트의 EXTRA_ASSIST_CONTEXT 부분에 표시할 수 있습니다.

콘텐츠 설명

앱은 onProvideAssistContent()를 구현하여 현재 활동과 관련된 콘텐츠 관련 참조를 제공함으로써 어시스턴트 사용자 환경을 개선할 수 있습니다. JSON-LD 객체를 통해 Schema.org에서 정의한 공통 언어를 사용하여 앱 콘텐츠를 설명할 수 있습니다. 아래 예에서 음악 앱은 구조화된 데이터를 제공하여 사용자가 현재 보고 있는 음악 앨범을 설명합니다.

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

자바

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

다음과 같은 이점을 제공하는 onProvideAssistContent()의 맞춤 구현을 통해 사용자 환경을 개선할 수도 있습니다.

참고: 맞춤 텍스트 선택 구현을 사용하는 앱은 onProvideAssistContent()를 구현하고 setClipData()를 호출해야 할 수 있습니다.

기본 구현

onProvideAssistData()onProvideAssistContent() 콜백이 모두 구현되지 않은 경우 현재 창이 보안으로 플래그 지정되어 있지 않는 한 시스템은 작업을 계속하여 자동으로 수집된 정보를 어시스턴트에 전달합니다. 그림 3과 같이 시스템은 onProvideStructure()onProvideVirtualStructure()의 기본 구현을 사용하여 텍스트 및 뷰 계층 구조 정보를 수집합니다. 뷰에서 맞춤 텍스트 그리기를 구현하는 경우 setText(CharSequence)를 호출하여 사용자에게 표시되는 텍스트를 어시스턴트에 제공하려면 onProvideStructure()를 재정의하세요.

대부분의 경우 접근성 지원을 구현하면 어시스턴트가 필요한 정보를 얻을 수 있습니다. 접근성 지원을 구현하려면 다음을 포함하여 애플리케이션을 액세스 가능하게 만들기에 설명된 권장사항을 확인하세요.

어시스턴트에서 뷰 제외

민감한 정보를 처리하기 위해 앱은 WindowManagerFLAG_SECURE 레이아웃 매개변수를 설정하여 현재 뷰를 어시스턴트에서 제외할 수 있습니다. 대화상자를 포함하여 활동으로 만들어진 모든 창에 FLAG_SECURE를 명시적으로 설정해야 합니다. 앱에서는 setSecure()를 사용하여 노출 영역을 어시스턴트에서 제외할 수도 있습니다. 어시스턴트에서 모든 뷰를 제외하는 전역 (앱 수준) 메커니즘은 없습니다. FLAG_SECURE로 인해 Assist API 콜백의 실행이 중지되는 것은 아닙니다. FLAG_SECURE를 사용하는 활동은 이 가이드의 앞부분에 설명된 콜백을 사용하여 어시스턴트 앱에 명시적으로 정보를 제공할 수 있습니다.

참고: 기업 계정 (Android for Work)의 경우 관리자가 DevicePolicyManager API의 setScreenCaptureDisabled() 메서드를 사용하여 직장 프로필의 어시스턴트 데이터 수집을 사용 중지할 수 있습니다.

음성 상호작용

Assist API 콜백은 주요 구문 감지 시에도 호출됩니다. 자세한 내용은 음성 액션 문서를 참고하세요.

Z-order 고려사항

어시스턴트는 현재 활동 위에 표시되는 경량형 오버레이 창을 사용합니다. 사용자가 언제든지 어시스턴트를 활성화할 수 있으므로, 그림 4와 같이 오버레이 창을 방해하는 영구적인 시스템 알림 창을 만들지 마세요.

그림 4. 지원 레이어 Z-order

앱이 시스템 알림 창을 사용하는 경우 이 창을 화면에 열어 두면 사용자가 불편할 수 있으니 즉시 삭제하세요.

대상 앱

어시스턴트 앱은 일반적으로 딥 링크를 이용하여 대상 앱을 찾습니다. 앱을 잠재적인 대상 앱으로 만들려면 딥 링크 지원을 추가해 보세요. 현재 사용자 컨텍스트와 딥 링크 또는 오버레이 창(그림 1의 3단계)에 표시되는 기타 잠재적 작업 간의 일치는 Google 어시스턴트의 구현에 따라 달라집니다. 예를 들어 Google 어시스턴트 앱은 대상 앱으로 트래픽을 유도하기 위해 딥 링크와 앱 링크를 사용합니다.

자신의 어시스턴트 구현

자신의 어시스턴트를 구현하고자 할 수 있습니다. 그림 2와 같이 사용자는 활성 어시스턴트 앱을 선택할 수 있습니다. 어시스턴트 앱은 VoiceInteraction에 나온 것처럼 VoiceInteractionSessionServiceVoiceInteractionSession 구현을 제공해야 합니다. 또한 BIND_VOICE_INTERACTION 권한도 필요합니다. 그러면 어시스턴트는 onHandleAssist()에서 AssistStructure의 인스턴스로 표시된 텍스트 및 뷰 계층 구조를 수신할 수 있습니다. onHandleScreenshot()을 통해 스크린샷을 수신합니다.