Optymalizacja treści kontekstowych dla Asystenta

Android 6.0 Marshmallow oferuje użytkownikom nowy sposób korzystania z aplikacji za pomocą aplikacji z Asystentem, takich jak Asystent Google. Asystent to okno najwyższego poziomu, które użytkownicy mogą wyświetlać, aby uzyskać informacje o działaniach związanych z bieżącą aktywnością. Te działania mogą obejmować precyzyjne linki do innych aplikacji na urządzeniu.

Użytkownicy aktywują Asystenta, naciskając i przytrzymując przycisk ekranu głównego, lub wypowiadając słowo kluczowe. W odpowiedzi system otworzy okno najwyższego poziomu, w którym będą wyświetlane działania powiązane z kontekstem.

Aplikacja z Asystentem, np. Asystent Google, wdraża nakładkę Asystenta za pomocą funkcji Now on Tap, która współpracuje z funkcjami na poziomie platformy Androida. System pozwala użytkownikowi wybrać aplikację asystującą, która pobiera z Twojej aplikacji informacje kontekstowe za pomocą interfejsu Assist API na Androida.

Z tego przewodnika dowiesz się, jak aplikacje na Androida korzystają z interfejsu Assist API na Androidzie, aby zwiększać komfort korzystania z Asystenta. Aby dowiedzieć się, jak utworzyć aplikację do multimediów, a Asystentem będzie mógł uruchamiać i sterować urządzeniami, przeczytaj artykuł o Asystencie Google i aplikacjach do multimediów.

Korzystanie z asystentów

Rysunek 1 przedstawia typową interakcję użytkownika z Asystentem. Gdy użytkownik przytrzyma i przytrzyma przycisk ekranu głównego, wywołania zwrotne interfejsu Assist API są wywoływane w aplikacji źródłowej (krok 1). Asystent renderuje okno nakładki (kroki 2 i 3), a potem użytkownik wybiera działanie, które ma wykonać. Asystent wykonuje wybrane działanie, np. uruchamia intencję za pomocą precyzyjnego linku do aplikacji restauracji (miejsce docelowe) (krok 4).

Rysunek 1. Przykład interakcji z Asystentem z funkcją Now on Tap w aplikacji Google

Użytkownicy mogą skonfigurować asystenta, wybierając Ustawienia > Aplikacje > Aplikacje domyślne > Asystent i rozpoznawanie mowy. Użytkownicy mogą zmieniać opcje systemowe, takie jak dostęp do zawartości ekranu w postaci tekstu czy robienie zrzutu ekranu, jak pokazano na rysunku 2.

Rysunek 2. Ustawienia Asystenta i rozpoznawania mowy

Aplikacja źródłowa

Aby aplikacja działała z asystentem jako źródłem informacji dla użytkownika, stosuj tylko sprawdzone metody dotyczące ułatwień dostępu. W tej sekcji opisujemy, jak podać dodatkowe informacje, które pomagają ulepszyć działanie Asystenta. Wyjaśniamy też, w sytuacjach, które wymagają specjalnej obsługi, np. w widokach niestandardowych.

Udostępnienie asystentowi dodatkowych informacji

Oprócz tekstu i zrzutu ekranu aplikacja może też udostępniać Asystentowi inne informacje. Na przykład aplikacja muzyczna może przekazać informacje o bieżącym albumie, aby asystent mógł proponować bardziej inteligentne działania dostosowane do bieżącej aktywności. Pamiętaj, że interfejsy Assist API nie zapewniają elementów sterujących multimediami. Aby dodać elementy sterujące multimediami, przeczytaj artykuł o Asystencie Google i aplikacjach do multimediów.

Aby udostępnić asystentowi dodatkowe informacje, aplikacja udostępnia globalny kontekst aplikacji, rejestrując detektor aplikacji i przekazuje informacje o konkretnej aktywności za pomocą wywołań zwrotnych aktywności, tak jak to widać na Rysunku 3:

Rysunek 3. Diagram sekwencji cyklu życia interfejsu API wspomagającego

Aby zapewnić globalny kontekst aplikacji, aplikacja tworzy implementację Application.OnProvideAssistDataListener i rejestruje ją za pomocą registerOnProvideAssistDataListener(). Aby podać informacje kontekstowe związane z konkretną aktywnością, zastąpi ona ustawienia onProvideAssistData() i onProvideAssistContent(). Dwie metody aktywności są wywoływane po wywołaniu opcjonalnego globalnego wywołania zwrotnego. Wywołania zwrotne są wykonywane w wątku głównym, dlatego powinny zakończyć się od razu. Wywołania zwrotne są wywoływane tylko wtedy, gdy aktywność jest aktywna.

Dostarczanie kontekstu

Gdy użytkownik aktywuje asystenta, wywoływana jest intencja onProvideAssistData() umożliwiająca utworzenie pełnej intencji ACTION_ASSIST ze wszystkimi kontekstami bieżącej aplikacji reprezentowanymi jako instancja AssistStructure. Możesz zastąpić tę metodę, aby umieścić w pakiecie dowolny element, który pojawi się w części EXTRA_ASSIST_CONTEXT intencji wspomagającej.

Opisywanie treści

Twoja aplikacja może zaimplementować onProvideAssistContent(), aby zwiększyć wygodę użytkowników korzystających z Asystenta dzięki udostępnianiu plików referencyjnych związanych z bieżącą aktywnością. Zawartość aplikacji możesz opisać, korzystając z popularnego słownika zdefiniowanego przez Schema.org za pomocą obiektu JSON-LD. W poniższym przykładzie aplikacja muzyczna udostępnia uporządkowane dane opisujące album muzyczny, który użytkownik obecnie ogląda:

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
}

Java

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

Aby zwiększyć komfort użytkowników, możesz też zastosować niestandardowe implementacje parametru onProvideAssistContent(), które mogą przynieść te korzyści:

Uwaga: aplikacje, które używają niestandardowego wyboru tekstu, prawdopodobnie będą musiały zaimplementować funkcję onProvideAssistContent() i wywołać metodę setClipData().

Implementacja domyślna

Jeśli nie masz zaimplementowanego wywołania zwrotnego onProvideAssistData() ani onProvideAssistContent(), system kontynuuje kontynuowanie i przekazuje automatycznie zbierane informacje Asystentowi, chyba że bieżące okno jest oznaczone jako bezpieczne. Jak widać na Rysunku 3, system używa domyślnych implementacji onProvideStructure() i onProvideVirtualStructure() do zbierania tekstu i wyświetlania informacji o hierarchii. Jeśli w Twoim widoku jest zaimplementowany niestandardowy rysunek tekstowy, zastąp onProvideStructure(), aby przekazać Asystentowi tekst wyświetlany użytkownikowi, wywołując metodę setText(CharSequence).

W większości przypadków wdrożenie ułatwień dostępu umożliwia Asystentowi uzyskanie potrzebnych informacji. Aby wdrożyć ułatwienia dostępu, postępuj zgodnie ze sprawdzonymi metodami opisanymi w artykule na temat udostępniania aplikacji, w tym:

Wykluczanie widoków przez Asystenta

Aby obsługiwać informacje poufne, Twoja aplikacja może wykluczyć bieżący widok z Asystenta, ustawiając parametr układu FLAG_SECURE dla WindowManager. Musisz skonfigurować FLAG_SECURE bezpośrednio dla każdego okna utworzonego przez aktywność, w tym okien dialogowych. Aplikacja może też używać setSecure(), aby wykluczać wybrane miejsce z pomocy Asystenta. Nie ma globalnego mechanizmu (na poziomie aplikacji) do wykluczania z Asystenta wszystkich widoków danych. Pamiętaj, że FLAG_SECURE nie powoduje zakończenia wywoływania wywołań zwrotnych interfejsu Assist API. Aktywność wykorzystująca funkcję FLAG_SECURE może nadal bezpośrednio przekazywać informacje do aplikacji Asystenta za pomocą wywołań zwrotnych opisanych we wcześniejszej części tego przewodnika.

Uwaga: w przypadku kont firmowych (Android for Work) administrator może wyłączyć zbieranie danych Asystenta dla profilu służbowego przy użyciu metody setScreenCaptureDisabled() interfejsu DevicePolicyManager API.

Interakcje głosowe

Wywołania zwrotne interfejsu Assist API są również wywoływane po wykryciu wyrażeń kluczowych. Więcej informacji znajdziesz w dokumentacji komend głosowych.

Uwagi na temat kolejności warstw

Asystent używa lekkiego okna nakładki wyświetlanego nad bieżącą aktywnością. Użytkownik może aktywować Asystenta w dowolnej chwili, więc nie twórz trwałych okien alertów systemowych, które zakłócają działanie okna nakładki (jak pokazano na rysunku 4).

Rysunek 4. Warstwa pomocnicza w kolejności Z

Jeśli aplikacja korzysta z okien alertów systemowych, jak najszybciej je usuń, ponieważ pogarsza komfort korzystania z nich.

Aplikacja docelowa

Aby znaleźć aplikacje docelowe, aplikacje Asystenta zwykle wykorzystują precyzyjne linki. Aby Twoja aplikacja była potencjalną aplikacją docelową, pomyśl o dodaniu obsługi precyzyjnych linków. Dopasowywanie kontekstu bieżącego użytkownika do precyzyjnych linków lub innych potencjalnych działań wyświetlanych w oknie nakładki (jak widać na Rysunku 3) dotyczy tylko wdrożenia Asystenta Google. Na przykład aplikacja Asystent Google korzysta z precyzyjnych linków i linków aplikacji, aby przyciągać użytkowników do aplikacji docelowych.

Wdrażanie własnego Asystenta

Możesz też zaimplementować własnego asystenta. Jak widać na Rys. 2, użytkownik może wybrać aktywną aplikację Asystent. Aplikacja Asystent musi udostępnić implementację VoiceInteractionSessionService i VoiceInteractionSession, jak pokazano w tym VoiceInteraction przykładzie. Wymaga też uprawnienia BIND_VOICE_INTERACTION. Dzięki temu asystent może otrzymać hierarchię tekstu i widoków reprezentowaną przez element AssistStructure w systemie onHandleAssist(). Zrzut ekranu otrzymuje do onHandleScreenshot().