Voice Action Sistem bukan lagi jalur yang direkomendasikan untuk berintegrasi dengan Asisten. Lihat dokumentasi Action Aplikasi untuk informasi lebih lanjut tentang alternatif build.

Interaksi Suara

Interaksi suara adalah jenis aktivitas Android khusus yang dipicu oleh suara pengguna, yang juga memungkinkannya menyelesaikan tindakan dengan suara. Sebaliknya, intent aktivitas normal dirancang untuk memulai tindakan, tetapi selesai melalui interaksi sentuh.

Misalnya, intent DIAL Android diimplementasikan oleh aplikasi telepon, tetapi intent hanya melakukan pramuat nomor telepon ke telepon - pengguna harus menyentuh tombol untuk benar-benar memulai panggilan.

Menentukan interaksi suara

Aplikasi menetapkan aktivitas interaksi suara di file manifes Android melalui kategori android.intent.category.VOICE.

Contoh berikut menunjukkan bagaimana Anda dapat menentukan aktivitas interaksi suara:

<activity android:name="org.example.MyVoiceActivity">
  <intent-filter>
    <action android:name="org.example.MY_ACTION_INTENT" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.VOICE" />
  </intent-filter>
</activity>

Contoh berikutnya menunjukkan bagaimana Anda dapat menentukan aktivitas interaksi sentuh yang sesuai:

<activity android:name="org.example.MyTouchActivity">
  <intent-filter>
    <action android:name="org.example.MY_ACTION_INTENT" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Menangani interaksi suara

Setelah menerima intent, aplikasi Anda harus menentukan interaksi yang sesuai. Hal yang tepat akan bergantung pada sifat aplikasi Anda: seberapa banyak interaksi yang ingin Anda tanyakan kepada pengguna, seberapa amankah menyelesaikan tindakan, dan sebagainya.

Persetujuan menggunakan interaksi suara

Sering kali, pengguna perlu memverifikasi tindakan yang akan terjadi sebagai akibat dari permintaan mereka. Misalnya, permintaan pengguna untuk memesan taksi dapat mencakup semua detail permintaan (waktu, tempat, dan tujuan), tetapi detail tambahan (seperti biaya dan waktu kedatangan) harus diverifikasi dengan pengguna.

Gambar yang menampilkan aktivitas suara

Contoh ini menunjukkan cara menangani interaksi suara dengan konfirmasi suara:

class MyVoiceActivity extends Activity {
  class Confirm extends VoiceInteractor.ConfirmationRequest {
    public Confirm(String ttsPrompt, String visualPrompt) {
      VoiceInteractor.Prompt prompt = new VoiceInteractor.Prompt(
        new String[] {ttsPrompt}, visualPrompt);
      super(prompt, null);
    }

    @Override
    public void onConfirmationResult(
        boolean confirmed, Bundle null) {
      if (confirmed) {
        doAction();
      }
      finish();
    }
  };

  @Override
  public void onResume() {
    if (isVoiceInteraction()) {
      String ttsPrompt = getConfirmationTts();
      String visualPrompt = getConfirmationDisplayText();
      getVoiceInteractor().sendRequest(new Confirm(ttsPrompt, visualPrompt));
    } else {
      finish();
    }
  }
}

Dalam contoh ini, aktivitas meminta konfirmasi saat dimulai sebagai interaksi suara. Pertama-tama, pemeriksaan tersebut adalah aktivitas suara dengan memanggil isVoiceInteraction(). Subclass VoiceInteractor.ConfirmationRequest menangani konfirmasi asinkron dari pengguna (diterima atau ditolak) untuk menentukan apakah tindakan harus diselesaikan.

Dalam hal ini, pengguna akan menerima perintah lisan dan diminta untuk menerima konfirmasi secara lisan (misalnya dengan jawaban ya atau tidak). Aktivitas ini akan menerima callback yang menunjukkan hasilnya.

Menyetujui tanpa konfirmasi

Dalam beberapa kasus, cukup diketahui bahwa intent tersebut berasal dari suara pengguna, yang menyiratkan bahwa tidak diperlukan informasi lebih lanjut untuk mengonfirmasi intent. Misalnya, melakukan panggilan telepon atau mengirim email mungkin merupakan interaksi yang wajar untuk didukung.

Panggilan isVoiceInteractionRoot() memastikan bahwa intent berasal dari suara pengguna. Meskipun isVoiceInteraction() menampilkan nilai benar meskipun aktivitas interaksi suara aplikasi lain meluncurkan aktivitas suara Anda tanpa intent pengguna apa pun, isVoiceInteractionRoot() hanya menampilkan true jika aktivitas tersebut dimulai langsung oleh voice action pengguna di Aplikasi Google Penelusuran.

Contoh berikutnya menunjukkan cara menangani interaksi suara tanpa konfirmasi:

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteractionRoot()) {
         // Interaction started by the users voice
        doAction();
    }
    finish();
  }
}

Jika aktivitas tersebut bukan aktivitas suara, aktivitas tersebut harus diselesaikan dengan sentuhan. Interaksi suara harus selalu "kembali" untuk menyentuh komunikasi jika sesuai.

Menyelesaikan Interaksi Suara

Setelah aplikasi Anda selesai mengajukan pertanyaan kepada pengguna, aplikasi Anda harus memanggil finish() untuk menutup Plat Dialog. Jika tidak, Pelat Dialog yang kosong akan terus ditampilkan di bagian bawah layar, yang akan menempati ruang layar dan membingungkan pengguna.

Jika ingin mempertahankan pengguna dalam Aktivitas Anda, Anda dapat memulai Aktivitas normal baru dan menyelesaikan aktivitas interaksi suara. Mulai Aktivitas Anda dengan tanda Intent.FLAG_ACTIVITY_NEW_TASK untuk keluar dari tugas interaksi suara.

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteractionRoot()) {
        doAction();
    }

    // Start my main non-voice Activity
    Intent intent = new Intent(this, MyMainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    finish();
  }
}

Mengirim status penyelesaian

Berkomunikasi status penyelesaian interaksi suara adalah bagian penting dari membuat tindakan individual menjadi pengalaman bantuan yang berharga bagi pengguna. Contoh:

  • Hasil beberapa tindakan dapat disediakan kepada pengguna untuk penggunaan mendatang - misalnya, detail pemesanan reservasi restoran dapat otomatis tersedia sebagai kartu pengingat di Google Now atau kueri [reservasi saya].
  • Aktivitas dapat memilih untuk menampilkan URI konteks (misalnya, URI penyedia konten di perangkat atau deep link URL Web) yang menunjukkan referensi ke hasil tindakan. Hal ini memungkinkan aplikasi untuk mengenali saat tindakan merupakan "ikuti" ke tindakan sebelumnya (mis. batalkan alarm yang baru saja disetel / bagikan foto yang baru saja diambil)
  • Menunjukkan saat tindakan tidak dapat diselesaikan. Bagian penting dari membangun kepercayaan pengguna dalam sistem adalah menangani kesalahan atau keterbatasan interaksi suara secara bertanggung jawab. Misalnya, alur alur login atau memasukkan kartu kredit mungkin tidak memungkinkan melalui suara. Hal ini khususnya penting saat berinteraksi dengan mata tanpa interaksi di lingkungan otomotif.

Contoh berikut menunjukkan cara melaporkan status penyelesaian interaksi:

class MyVoiceActivity extends Activity {
  @Override
  public void onResume() {
    if (isVoiceInteraction()) {
      Bundle status = new Bundle();
      VoiceInteractor.Request request = null;

      if (doAction(status)) {
        request = new VoiceInteractor.CompleteVoiceRequest(
            "Success", status);
      } else {
        request = new VoiceInteractor.AbortVoiceRequest(
            "Too Complex", status);
      }
      getVoiceInteractor().sendRequest(request);
    }
    finish();
  }
}

Interaksi multi-modal

Pengguna sering menggabungkan interaksi suara dan sentuhan saat menyelesaikan tindakan karena berbagai alasan (misalnya masalah pengenalan ucapan, memilih dari daftar banyak opsi, dll.), sehingga penting untuk mendukung kedua modalitas interaksi.

Aktivitas suara harus menangani tampilan antarmuka sentuh minimal saat berinteraksi dengan suara. Beberapa hal yang harus diingat:

  • Hanya tampilkan kontrol yang diperlukan untuk menyelesaikan interaksi saat ini. Bagian dari layar sentuh yang tersedia untuk tampilan aktivitas mungkin dikurangi untuk menampilkan panel interaksi suara. Aplikasi tidak boleh menampilkan panel Aplikasi.
  • Jika pengguna berinteraksi dengan sentuhan saat interaksi suara sedang tertunda (misalnya, pengguna mengonfirmasi dengan menekan tombol, bukan melalui suara), panggil VoiceInteractor.Request.cancel untuk menghentikan interaksi suara.
  • Setelah beralih ke interaksi sentuh, pengguna harus melanjutkan interaksi interaksi.