Input suara memungkinkan Anda membuat antarmuka handsfree. Glass memberi Anda tiga cara untuk memanfaatkan input suara.
Perintah suara utama memulai Glassware dari kartu Home, perintah suara kontekstual dapat mengeksekusi tindakan dalam suatu aktivitas, dan aktivitas pengenalan ucapan sistem memungkinkan Anda menerima input suara bentuk bebas dari pengguna.
Perintah suara utama
Perintah suara ini meluncurkan Glassware dari kartu Home (kartu Jam). Saat Anda mendeklarasikan perintah suara utama, Glass akan otomatis membuat item menu sentuh sebagai pengganti jika pengguna memutuskan untuk memulai Glassware Anda dengan mengetuk kartu Home.
Untuk menambahkan perintah suara ke menu utama suara ok Glass:
Buat resource XML untuk perintah suara di
res/xml/<my_voice_trigger>.xml
yang menggunakan salah satu perintah suara yang ada yang ditentukan diVoiceTriggers.Command
. Misalnya, berikut cara menggunakan "Mulai lari".<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
Untuk membuat perintah suara yang meminta pengguna mengucapkan frasa tambahan sebelum memulai aktivitas atau layanan Anda, sertakan juga elemen
input
. Misalnya, Anda dapat melakukannya jika Anda menggunakan "Post a update".<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
Daftarkan filter intent menggunakan tindakan
com.google.android.glass.action.VOICE_TRIGGER
dalam manifes Android Anda. Filter intent akan memulai aktivitas atau layanan Anda jika mendeteksi pengguna mengucapkan perintah suara.<?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 di menu sentuh ok, kaca.<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 akan 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 salah satu atau semua fitur berikut untuk memulai Glassware,
tentukan fitur tersebut 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, bukan sentuhan.
Guna mengaktifkan perintah suara kontekstual untuk aktivitas tertentu:
Panggil
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
di aktivitas yang diinginkan untuk mengaktifkan perintah suara kontekstual. Dengan mengaktifkan fitur ini, menu "ok Glass" akan muncul di area footer layar setiap kali aktivitas ini menerima fokus.Ganti
onCreatePanelMenu()
dan tangani kasus ketikaWindowUtils.FEATURE_VOICE_COMMANDS
diaktifkan. Jika diaktifkan, di sinilah Anda akan melakukan penyiapan menu satu kali, seperti meng-inflate resource menu atau memanggil metodeMenu.add()
untuk membuat sistem menu suara.Ganti
onMenuItemSelected()
untuk menangani perintah suara saat pengguna mengucapkannya. Setelah pengguna selesai memilih item menu, perintah suara "ok, kaca" akan otomatis muncul kembali di bagian footer layar, yang siap menerima perintah suara baru, selama aktivitas tetap fokus.Kode berikut memungkinkan perintah suara kontekstual, meng-inflate resource menu jika sesuai, 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 adalah contoh resource menu yang digunakan oleh aktivitas sebelumnya. Perhatikan cara membuat item menu bertingkat untuk sistem menu suara hierarki. Pada contoh berikut, item menu pertama dapat diakses sebagai: ok Glass, 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()
, periksa apakahWindowUtils.FEATURE_VOICE_COMMANDS
diaktifkan atau tidak. Jika diaktifkan, di sinilah Anda dapat melakukan logika lain untuk menyiapkan sistem menu, seperti menambahkan dan menghapus item menu tertentu berdasarkan beberapa kriteria. Anda juga dapat mengaktifkan menu suara kontekstual (menampilkantrue
) dan menonaktifkan (menampilkanfalse
) 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 resource yang telah Anda miliki untuk menu sentuh dan sekaligus mendukung kedua jenis menu.
Yang perlu Anda lakukan adalah memeriksa fitur Window.FEATURE_OPTIONS_PANEL
selain fitur WindowUtils.FEATURE_VOICE_COMMANDS
yang sudah
Anda periksa dalam beberapa metode, lalu menambahkan logika untuk membuka menu
sentuh pada beberapa tindakan pengguna, seperti ketukan.
Misalnya, Anda dapat mengubah contoh aktivitas sebelumnya untuk menambahkan dukungan bagi 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 tidak publik untuk pengembangan
Jika ingin mendistribusikan Glassware, Anda harus menggunakan perintah suara utama
yang disetujui di
VoiceTriggers.Command
dan perintah suara kontekstual yang disetujui di
ContextualMenus.Command
.
Jika 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 dalam
res/values/strings.xml
yang menentukan nama pemicu suara Anda. Secara opsional, deklarasikan perintah suara untuk menampilkan Glassware pengenalan ucapan 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 tidak publik, Anda harus menggunakan atributkeyword
, bukan atributcommand
yang digunakan untuk perintah suara yang disetujui. Atributkeyword
harus merupakan referensi ke resource string yang menentukan perintah suara. Untuk pemicu suara sederhana yang segera memulai aktivitas atau layanan, cukup tentukan elementrigger
:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
Untuk membuat pemicu suara yang meminta pengguna mengucapkan frasa tambahan sebelum memulai aktivitas atau layanan Anda, sertakan juga elemen input:
<?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 untuk 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 menampilkan teks yang ditranskripsikan setelah selesai. Untuk memulai aktivitas:
- Panggil
startActivityForResult()
dengan intentACTION_RECOGNIZE_SPEECH
. Tambahan intent berikut didukung saat memulai aktivitas: Ganti callback
onActivityResult()
untuk menerima teks yang ditranskripsikan dari intent tambahanEXTRA_RESULTS
. 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); }