Input suara memungkinkan Anda membuat antarmuka yang benar-benar handsfree. Kaca memberi Anda tiga cara untuk menggunakan input suara.
Perintah suara utama memulai Glassware dari kartu Home, suara kontekstual perintah bisa mengeksekusi tindakan dalam suatu aktivitas, dan ucapan sistem memungkinkan Anda menerima input suara bentuk bebas dari pengguna.
Perintah suara utama
Perintah suara ini meluncurkan Glassware dari kartu Home (kartu Jam). Jika Anda mendeklarasikan perintah suara utama, Glass akan otomatis membuat item menu sentuh sebagai alternatif jika pengguna memutuskan untuk memulai Glassware Anda dengan mengetuk Kartu beranda.
Untuk menambahkan perintah suara ke menu utama ok kaca:
Membuat resource XML untuk perintah suara di
res/xml/<my_voice_trigger>.xml
yang menggunakan salah satu perintah suara yang sudah ada didefinisikan dalamVoiceTriggers.Command
. Misalnya, berikut cara menggunakan "Start a run".<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
Untuk membuat perintah suara yang meminta pengguna mengucapkan sebelum memulai aktivitas atau layanan, sertakan
input
juga. Misalnya, Anda mungkin ingin melakukan ini jika Anda menggunakan "Posting pembaruan".<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Daftarkan filter intent menggunakan
com.google.android.glass.action.VOICE_TRIGGER
tindakan di Manifes Android. Filter intent memulai aktivitas atau layanan Anda jika mendeteksi pengguna yang mengucapkan perintah suara Anda.<?xml version="1.0" encoding="utf-8"?> <application ...> <activity | service ...> <intent-filter> <action android:name= "com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/my_voice_trigger" /> </activity | service> // ... </application>
Deklarasikan atribut
android:icon
untuk aktivitas atau layanan Anda. Hal ini memungkinkan Glass menampilkan ikon untuk Glassware Anda di oke, kaca menu sentuhnya.<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
Jika perintah suara Anda menggunakan perintah suara dan memulai aktivitas, dapatkan teks yang ditranskripsikan dengan kode berikut (seperti dalam
onResume()
):ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
Jika perintah suara memulai layanan, tambahan intent tersedia di Callback
onStartCommand()
:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
Menetapkan batasan
Jika Anda memerlukan satu atau semua fitur berikut
untuk memulai Gelas Anda,
menentukannya di resource res/xml/<my_voice_trigger>.xml
.
Jika fitur tidak tersedia, Glass akan menonaktifkan perintah suara:
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
Perintah suara kontekstual
Perintah suara kontekstual memungkinkan pengguna melakukan tindakan dari aktivitas. Anda membuat perintah suara kontekstual dengan API menu Android standar, tetapi pengguna dapat memanggil item menu dengan perintah suara sebagai ganti sentuhan.
Guna mengaktifkan perintah suara kontekstual untuk aktivitas tertentu:
Hubungi
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
dalam aktivitas yang diinginkan untuk mengaktifkan perintah suara kontekstual. Dengan fitur ini diaktifkan, menu "ok kaca" akan muncul di area footer layar ketika aktivitas ini mendapatkan fokus.Mengganti
onCreatePanelMenu()
dan menangani kasus di manaWindowUtils.FEATURE_VOICE_COMMANDS
diaktifkan. Jika diaktifkan, Anda dapat melakukan penyiapan menu satu kali, seperti meng-inflate resource menu atau memanggilMenu.add()
untuk membuat sistem menu suara.Mengganti
onMenuItemSelected()
untuk menangani perintah suara saat pengguna mengucapkannya. Saat pengguna selesai memilih item menu, perintah suara "ok, kaca" secara otomatis akan muncul kembali di bagian footer layar, siap untuk menerima suara baru selama aktivitas tetap dalam fokus.Kode berikut memungkinkan perintah suara kontekstual, meng-inflate resource menu jika diperlukan, dan menangani perintah suara saat diucapkan:
public class ContextualMenuActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); // Requests a voice menu on this activity. As for any other // window feature, be sure to request this before // setContentView() is called getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_main); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { getMenuInflater().inflate(R.menu.main, menu); return true; } // Pass through to super to setup touch menu. return super.onCreatePanelMenu(featureId, menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { switch (item.getItemId()) { case R.id.dogs_menu_item: // handle top-level dogs menu item break; case R.id.cats_menu_item: // handle top-level cats menu item break; case R.id.lab_menu_item: // handle second-level labrador menu item break; case R.id.golden_menu_item: // handle second-level golden menu item break; case R.id.calico_menu_item: // handle second-level calico menu item break; case R.id.cheshire_menu_item: // handle second-level cheshire menu item break; default: return true; } return true; } // Good practice to pass through to super if not handled return super.onMenuItemSelected(featureId, item); } }
Berikut ini contoh sumber daya menu yang digunakan oleh aktivitas sebelumnya. Perhatikan cara membuat item menu bertingkat untuk suara hierarkis sistem menu. Dalam contoh berikut, item menu pertama dapat diakses sebagai: ok kaca, Show me dogs, Labrador.
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/dogs_menu_item" android:title="@string/show_me_dogs"> <menu> <item android:id="@+id/lab_menu_item" android:title="@string/labrador" /> <item android:id="@+id/golden_menu_item" android:title="@string/golden" /> </menu> </item> <item android:id="@+id/cats_menu_item" android:title="@string/show_me_cats"> <menu> <item android:id="@+id/cheshire_menu_item" android:title="@string/cheshire" /> <item android:id="@+id/calico_menu_item" android:title="@string/calico" /> </menu> </item> </menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/play_menu_item" android:title="PLAY_MUSIC" /> <item android:id="@+id/pause_menu_item" android:title="PAUSE_MUSIC" /> </menu>
(Opsional) Ganti
onPreparePanel()
, memeriksa apakahWindowUtils.FEATURE_VOICE_COMMANDS
diaktifkan. Jika diaktifkan, di sinilah Anda dapat melakukan logika lain untuk menyiapkan sistem menu, seperti menambahkan dan menghapus item menu tertentu berdasarkan beberapa kriteria. Anda dapat aktifkan juga menu suara kontekstual (tampilkantrue
) dan nonaktifkan (tampilkanfalse
) berdasarkan beberapa kriteria. Contoh:private boolean mVoiceMenuEnabled; ... @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { // toggle this boolean on and off based on some criteria return mVoiceMenuEnabled; } // Good practice to call through to super for other cases return super.onPreparePanel(featureId, view, menu); }
Mendukung menu suara dan sentuh secara bersamaan
Karena perintah suara kontekstual menggunakan API menu Android yang ada, Anda dapat menggunakan kembali banyak kode dan sumber daya yang sudah Anda miliki untuk menu sentuh dan secara bersamaan mendukung kedua jenis menu.
Anda hanya perlu memeriksa fitur Window.FEATURE_OPTIONS_PANEL
selain fitur WindowUtils.FEATURE_VOICE_COMMANDS
yang sudah Anda
kita periksa dalam beberapa metode,
lalu tambahkan logika untuk membuka
menu pada beberapa tindakan pengguna, seperti ketukan.
Misalnya, Anda dapat mengubah aktivitas sebelumnya contoh untuk menambahkan dukungan menu sentuh seperti ini (perubahan diberi komentar):
// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
Dengan perubahan ini, Anda dapat mengetuk atau mengucapkan ok kaca untuk menampilkan menu Anda.
Menggunakan perintah suara yang tidak tercantum untuk pengembangan
Jika akan mendistribusikan Glassware, Anda harus menggunakan
perintah suara di
VoiceTriggers.Command
dan menyetujui perintah suara kontekstual dalam
ContextualMenus.Command
Jika Anda ingin menggunakan perintah suara yang tidak tersedia di GDK,
Anda dapat meminta izin Android di file AndroidManifest.xml
:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
Menggunakan perintah suara utama yang tidak tercantum
Deklarasikan nilai string di
res/values/strings.xml
yang menentukan nama pemicu suara Anda. Secara opsional, deklarasikan perintah suara untuk menampilkan pengenalan ucapan Glassware sebelum memulai Glassware Anda.<?xml version="1.0" encoding="utf-8"?> <resources> <string name="glass_voice_trigger">read me a story</string> <string name="glass_voice_prompt">what story?</string> </resources>
Buat resource XML untuk pemicu suara di
res/xml/<my_voice_trigger>.xml
. Untuk perintah suara yang tidak terdaftar, Anda harus menggunakan atributkeyword
, bukan atributcommand
yang digunakan untuk mendapatkan persetujuan perintah suara. Atributkeyword
harus menjadi referensi ke string resource yang mendefinisikan perintah suara. Untuk pemicu suara sederhana yang memulai aktivitas atau layanan dengan segera, cukup tetapkan elementrigger
:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
Untuk membuat pemicu suara yang meminta pengguna mengucapkan sebelum memulai aktivitas atau layanan Anda, sertakan elemen input juga:
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Menggunakan perintah suara kontekstual tidak publik
Saat membuat item menu, gunakan teks apa pun sebagai judul item menu. Contoh:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Use the constants defined in the ContextualMenus.Command enum-->
<item
android:id="@+id/pizza_menu_item"
android:title="@string/find_pizza" />
</menu>
Memulai pengenalan ucapan
Pengenalan ucapan Glassware menunggu pengguna berbicara dan mengembalikan teks yang ditranskripsikan setelah selesai. Untuk memulai aktivitas:
- Panggil
startActivityForResult()
dengan intentACTION_RECOGNIZE_SPEECH
. Tambahan intent berikut didukung saat memulai aktivitas: Ganti
onActivityResult()
untuk menerima teks yang ditranskripsikan dariEXTRA_RESULTS
intent tambahan. Callback ini dipanggil saat pengguna selesai berbicara.private static final int SPEECH_REQUEST = 0; private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); startActivityForResult(intent, SPEECH_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); // Do something with spokenText. } super.onActivityResult(requestCode, resultCode, data); }