Ottimizzazione dei contenuti contestuali per l'assistente

Android 6.0 Marshmallow introduce un nuovo modo per gli utenti di interagire con le app tramite le app di assistenti, come l'Assistente Google. L'assistente è una finestra di primo livello che gli utenti possono visualizzare per ottenere azioni pertinenti al contesto per l'attività in corso. Queste azioni potrebbero includere link diretti ad altre app sul dispositivo.

Gli utenti attivano l'assistente premendo a lungo il pulsante Home o pronunciando una frase chiave. In risposta, il sistema apre una finestra di primo livello che mostra le azioni pertinenti in base al contesto.

Un'app dell'assistente, come l'Assistente Google, implementa la finestra overlay dell'assistente tramite una funzionalità chiamata Now on Tap, che funziona con le funzionalità a livello di piattaforma Android. Il sistema consente all'utente di selezionare un'app di assistenza, che ottiene informazioni contestuali dalla tua app utilizzando l'API Assist di Android.

Questa guida spiega in che modo le app per Android utilizzano l'API Assist di Android per migliorare l'esperienza utente con l'assistente. Per scoprire come creare un'app multimediale in modo che l'assistente possa avviarla e controllarla, consulta Assistente Google e app multimediali.

Usare gli assistenti

La figura 1 illustra una tipica interazione dell'utente con l'assistente. Quando l'utente preme a lungo il pulsante Home, i callback dell'API Assist vengono richiamati nell'app di origine (passaggio 1). L'assistente esegue il rendering della finestra dell'overlay (passaggi 2 e 3) e l'utente seleziona l'azione da eseguire. L'assistente esegue l'azione selezionata, ad esempio attiva un intent con un link diretto all'app del ristorante (destinazione) (passaggio 4).

Figura 1. Esempio di interazione con l'assistente con la funzionalità Now Ovunque dell'app Google

Gli utenti possono configurare l'assistente selezionando Impostazioni > App > App predefinite > Assistenza e input vocale. Gli utenti possono modificare le opzioni di sistema, ad esempio accedere ai contenuti dello schermo come testo e accedere a uno screenshot, come mostrato nella Figura 2.

Figura 2. Impostazioni assistenza e input vocale

App di origine

Per assicurarti che la tua app funzioni con l'assistente come fonte di informazioni per l'utente, devi solo seguire le best practice di accessibilità. Questa sezione descrive come fornire informazioni aggiuntive per contribuire a migliorare l'esperienza utente dell'assistente, nonché gli scenari che richiedono una gestione speciale, come le visualizzazioni personalizzate.

Condividi informazioni aggiuntive con l'assistente

Oltre al testo e allo screenshot, la tua app può condividere altre informazioni con l'assistente. Ad esempio, la tua app di musica può scegliere di trasmettere le informazioni sull'album in riproduzione in modo che l'assistente possa suggerire azioni più intelligenti personalizzate in base all'attività in corso. Tieni presente che le API Assist non forniscono controlli multimediali. Per aggiungere controlli multimediali, vedi Assistente Google e app multimediali.

Per fornire ulteriori informazioni all'assistente, l'app fornisce il contesto globale dell'applicazione registrando un listener di app e fornisce informazioni specifiche sull'attività con callback delle attività, come mostrato nella Figura 3:

Figura 3. Diagramma della sequenza del ciclo di vita dell'API Assist

Per fornire un contesto globale dell'applicazione, l'app crea un'implementazione di Application.OnProvideAssistDataListener e la registra utilizzando registerOnProvideAssistDataListener(). Per fornire informazioni contestuali specifiche per l'attività, l'attività aggira onProvideAssistData() e onProvideAssistContent(). I due metodi di attività vengono chiamati dopo l'attivazione del callback globale facoltativo. Poiché i callback vengono eseguiti nel thread principale, devono essere completati rapidamente. I callback vengono richiamati solo quando l'attività è in esecuzione.

Fornire contesto

Quando l'utente attiva l'assistente, onProvideAssistData() viene chiamato per creare un intent ACTION_ASSIST completo con tutto il contesto dell'applicazione attuale rappresentato come un'istanza di AssistStructure. Puoi ignorare questo metodo per inserire nel bundle qualsiasi elemento da visualizzare nella parte EXTRA_ASSIST_CONTEXT dell'intent di assistenza.

Descrizione dei contenuti

La tua app può implementare onProvideAssistContent() per migliorare l'esperienza utente dell'assistente fornendo riferimenti ai contenuti correlati all'attività corrente. Puoi descrivere i contenuti dell'app utilizzando il vocabolario comune definito da Schema.org tramite un oggetto JSON-LD. Nell'esempio riportato di seguito, un'app di musica fornisce dati strutturati per descrivere l'album musicale che l'utente sta attualmente visualizzando:

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

Puoi anche migliorare l'esperienza utente con implementazioni personalizzate di onProvideAssistContent(), che possono offrire i seguenti vantaggi:

Nota: le app che utilizzano un'implementazione personalizzata di selezione del testo devono implementare onProvideAssistContent() e chiamare setClipData().

Implementazione predefinita

Se non viene implementato né il callback onProvideAssistData() né il callback onProvideAssistContent(), il sistema procede e passa le informazioni raccolte automaticamente all'assistente, a meno che la finestra attuale non venga contrassegnata come sicura. Come mostrato nella Figura 3, il sistema utilizza le implementazioni predefinite di onProvideStructure() e onProvideVirtualStructure() per raccogliere informazioni sulla gerarchia di testo e visualizzazione. Se la visualizzazione implementa il disegno di testo personalizzato, sostituisci onProvideStructure() per fornire all'assistente il testo mostrato all'utente chiamando setText(CharSequence).

Nella maggior parte dei casi, l'implementazione del supporto per l'accessibilità consente all'assistente di ottenere le informazioni di cui ha bisogno. Per implementare il supporto per l'accessibilità, osserva le best practice descritte in Rendere accessibili le applicazioni, tra cui:

Esclusione delle visualizzazioni provenienti dagli assistenti

Per gestire le informazioni sensibili, la tua app può escludere la visualizzazione corrente dall'assistente impostando il parametro di layout FLAG_SECURE di WindowManager. Devi impostare FLAG_SECURE in modo esplicito per ogni finestra creata dall'attività, incluse le finestre di dialogo. La tua app può utilizzare anche setSecure() per escludere una piattaforma dall'assistente. Non esiste un meccanismo globale (a livello di app) per escludere tutte le visualizzazioni dall'assistente. Tieni presente che FLAG_SECURE non determina l'interruzione dell'attivazione dei callback dell'API Assist. L'attività che utilizza FLAG_SECURE può comunque fornire esplicitamente informazioni a un'app di assistenza utilizzando i callback descritti in precedenza in questa guida.

Nota: per gli account aziendali (Android for Work), l'amministratore può disattivare la raccolta dei dati dell'assistente per il profilo di lavoro utilizzando il metodo setScreenCaptureDisabled() dell'API DevicePolicyManager.

Interazioni vocali

I callback dell'API Assist vengono richiamati anche al rilevamento delle frasi chiave. Per ulteriori informazioni, consulta la documentazione relativa alle azioni vocali.

Considerazioni sull'ordine Z

Un assistente utilizza una leggera finestra overlay visualizzata sopra l'attività corrente. Poiché l'utente può attivare l'assistente in qualsiasi momento, non creare finestre di avviso di sistema permanenti che interferiscano con la finestra dell'overlay, come mostrato nella Figura 4.

Figura 4. Ordine Z del livello di assistenza

Se la tua app utilizza finestre di avviso di sistema, rimuovile subito perché lasciarle sullo schermo peggiora l'esperienza utente.

App di destinazione

Le app dell'assistente in genere sfruttano i link diretti per trovare le app di destinazione. Per rendere la tua app una potenziale app di destinazione, ti consigliamo di aggiungere il supporto dei link diretti. La corrispondenza tra il contesto dell'utente corrente e i link diretti o altre potenziali azioni visualizzate nella finestra dell'overlay (mostrata nel passaggio 3 nella Figura 1) è specifica per l'implementazione dell'Assistente Google. Ad esempio, l'app Assistente Google utilizza i link diretti e i link alle app per indirizzare il traffico alle app di destinazione.

Implementare il tuo assistente

Potresti voler implementare il tuo assistente. Come mostrato nella Figura 2, l'utente può selezionare l'app di assistenza attiva. L'app di assistenza deve fornire un'implementazione di VoiceInteractionSessionService e VoiceInteractionSession come mostrato in VoiceInteraction questo esempio. Richiede anche l'autorizzazione BIND_VOICE_INTERACTION. L'assistente può quindi ricevere la gerarchia di testo e visualizzazioni rappresentati come un'istanza di AssistStructure in onHandleAssist(). Riceve lo screenshot tramite onHandleScreenshot().