การป้อนข้อมูลด้วยเสียงช่วยให้คุณสร้างอินเทอร์เฟซแบบแฮนด์ฟรีได้อย่างแท้จริง Glass นําเสนอ 3 วิธีในการใช้การป้อนข้อมูลด้วยเสียง
คําสั่งเสียงหลักจะเริ่มการใช้งาน Glassware จากการ์ด Home, คําสั่งตามบริบทตามบริบทจะประมวลผลการทํางานภายในกิจกรรมได้ และกิจกรรมการจดจําคําพูดของระบบช่วยให้คุณได้รับอินพุตเสียงรูปแบบอิสระจากผู้ใช้
คําสั่งเสียงหลัก
คําสั่งเสียงเหล่านี้จะเปิดตัว Glassware จากการ์ด Home (การ์ดนาฬิกา) เมื่อคุณประกาศคําสั่งเสียงหลัก Glass จะสร้างรายการเมนูการสัมผัสเป็นโฆษณาสํารองโดยอัตโนมัติหากผู้ใช้ตัดสินใจเริ่มใช้ Glassware โดยแตะที่การ์ดในหน้าแรก
หากต้องการเพิ่มคําสั่งเสียงลงในเมนูหลักเสียงกระจก ให้ทําดังนี้
สร้างทรัพยากร XML สําหรับคําสั่งเสียงใน
res/xml/<my_voice_trigger>.xml
ที่ใช้คําสั่งเสียงที่มีอยู่ซึ่งกําหนดไว้ในVoiceTriggers.Command
เช่น วิธีใช้ "เริ่มต้นการวิ่ง"<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
หากต้องการสร้างคําสั่งเสียงที่แจ้งให้ผู้ใช้พูดวลีเพิ่มเติมก่อนเริ่มกิจกรรมหรือบริการของคุณ ให้ใส่องค์ประกอบ
input
ด้วย เช่น คุณอาจต้องดําเนินการนี้หากใช้ "โพสต์อัปเดต"<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
ลงทะเบียนตัวกรอง Intent โดยใช้การดําเนินการ
com.google.android.glass.action.VOICE_TRIGGER
ในไฟล์ Manifest ของ Android ตัวกรอง Intent จะเริ่มกิจกรรมหรือบริการหากตรวจพบผู้ใช้ที่พูดคําสั่งเสียง<?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>
ประกาศแอตทริบิวต์
android:icon
สําหรับกิจกรรมหรือบริการของคุณ ซึ่งจะทําให้ Glass แสดงไอคอนสําหรับ Glassware ใน เมนูสัมผัสกระจก<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
หากคําสั่งเสียงใช้ข้อความแจ้งด้วยเสียงและเริ่มกิจกรรม ให้รับข้อความข้อความถอดเสียงด้วยรหัสต่อไปนี้ (เช่น ใน
onResume()
)ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
หากคําสั่งเสียงเริ่มบริการ Intent เพิ่มเติมจะพร้อมใช้งานในการเรียกกลับ
onStartCommand()
ดังนี้@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
การตั้งค่าข้อจํากัด
หากต้องการใช้ฟีเจอร์ต่อไปนี้อย่างน้อย 1 ฟีเจอร์เพื่อเริ่มใช้ Glassware ให้ระบุในทรัพยากร res/xml/<my_voice_trigger>.xml
หากฟีเจอร์ดังกล่าวไม่พร้อมใช้งาน Glass จะปิดคําสั่งเสียง
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
คําสั่งเสียงตามบริบท
คําสั่งเสียงตามบริบทช่วยให้ผู้ใช้ดําเนินการจากกิจกรรมได้ คุณสร้างคําสั่งเสียงตามบริบทด้วย API เมนูของ Android มาตรฐานได้ แต่ผู้ใช้จะเรียกใช้รายการเมนูด้วยคําสั่งเสียงแทนการแตะได้
วิธีเปิดใช้คําสั่งเสียงตามบริบทสําหรับกิจกรรมใดกิจกรรมหนึ่ง
เรียก
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
ในกิจกรรมที่ต้องการเพื่อเปิดใช้คําสั่งเสียงตามบริบท เมื่อเปิดใช้งานฟีเจอร์นี้ เมนู "Ok Glass" จะปรากฏในพื้นที่ส่วนท้ายของหน้าจอเมื่อใดก็ตามที่กิจกรรมนี้โฟกัสอยู่ลบล้าง
onCreatePanelMenu()
และจัดการเคสที่เปิดใช้WindowUtils.FEATURE_VOICE_COMMANDS
หากเปิดใช้ ขั้นตอนนี้คือการตั้งค่าเมนูแบบครั้งเดียว เช่น การเพิ่มทรัพยากรเมนูหรือการเรียกเมธอดMenu.add()
เพื่อสร้างระบบเมนูเสียงลบล้าง
onMenuItemSelected()
เพื่อจัดการคําสั่งเสียงเมื่อผู้ใช้พูดคําสั่ง เมื่อผู้ใช้เลือกรายการในเมนูเสร็จแล้ว คําสั่งเสียง "ok glass" จะปรากฏขึ้นโดยอัตโนมัติในส่วนส่วนท้ายของหน้าจอ และพร้อมที่จะยอมรับคําสั่งด้วยเสียงใหม่ตราบใดที่กิจกรรมยังโฟกัสอยู่โค้ดต่อไปนี้จะเปิดคําสั่งเสียงตามบริบท ทําให้ทรัพยากรเมนูสูงเกินจริงตามความเหมาะสม และจัดการการสั่งงานด้วยเสียงเมื่อมีการพูดคําสั่ง
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); } }
ต่อไปนี้คือตัวอย่างของทรัพยากรเมนูที่ใช้โดยกิจกรรมก่อนหน้า ดูวิธีสร้างรายการเมนูที่ซ้อนกันสําหรับระบบเมนูแบบลําดับชั้น ในตัวอย่างต่อไปนี้ คุณจะเข้าถึงรายการเมนูแรกเป็น ok Glass, Show me dog, 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>
(ไม่บังคับ) ลบล้าง
onPreparePanel()
โดยตรวจสอบว่าเปิดใช้WindowUtils.FEATURE_VOICE_COMMANDS
แล้วหรือไม่ หากเปิดใช้ คุณจะสามารถสร้างตรรกะอื่นๆ เพื่อตั้งค่าระบบเมนูได้ เช่น การเพิ่มและนํารายการเมนูบางรายการออกตามเกณฑ์บางอย่าง คุณยังสามารถสลับเมนูเสียงตามบริบทเป็นเปิด (แสดงผลtrue
) และปิด (แสดงผลfalse
) ตามเกณฑ์บางอย่างได้อีกด้วย เช่น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); }
รองรับเมนูเสียงและการสัมผัสพร้อมกัน
เนื่องจากคําสั่งเสียงตามบริบทใช้ API เมนู Android ที่มีอยู่ คุณจึงนําโค้ดและทรัพยากรที่มีอยู่แล้วสําหรับเมนูแบบแตะมาใช้ซ้ําได้ และรองรับเมนูทั้ง 2 ประเภทพร้อมกันได้
สิ่งที่คุณต้องทําคือตรวจสอบฟีเจอร์ของ Window.FEATURE_OPTIONS_PANEL
นอกเหนือจากฟีเจอร์ WindowUtils.FEATURE_VOICE_COMMANDS
ที่คุณตรวจสอบใน 2-3 วิธีอยู่แล้ว จากนั้นเพิ่มตรรกะเพื่อเปิดเมนูการแตะในการดําเนินการบางอย่างของผู้ใช้ เช่น การแตะ
เช่น คุณสามารถเปลี่ยนตัวอย่างกิจกรรมก่อนหน้าเพื่อเพิ่มการรองรับเมนูการแตะในลักษณะนี้ (แสดงความคิดเห็นเกี่ยวกับการเปลี่ยนแปลง)
// 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) {
...
}
ด้วยการเปลี่ยนแปลงเหล่านี้ คุณสามารถแตะหรือพูดว่า ok Glass เพื่อแสดงเมนูของคุณ
การใช้คําสั่งเสียงไม่เป็นสาธารณะสําหรับการพัฒนา
หากต้องการเผยแพร่ Glassware คุณต้องใช้คําสั่งเสียงหลักที่ได้รับอนุมัติใน VoiceTriggers.Command
และคําสั่งเสียงตามบริบทที่ได้รับอนุมัติใน ContextualMenus.Command
หากต้องการใช้คําสั่งเสียงที่ไม่มีใน GDK คุณขอสิทธิ์ Android ในไฟล์ AndroidManifest.xml
ได้โดยทําดังนี้
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
การใช้คําสั่งเสียงหลักที่ไม่เป็นสาธารณะ
ประกาศค่าสตริงใน
res/values/strings.xml
ที่กําหนดชื่อของทริกเกอร์ด้วยเสียง คุณจะเลือกประกาศข้อความแจ้งด้วยเสียง เพื่อแสดง Glassware สําหรับการจดจําคําพูดก่อนเริ่ม Glassware<?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>
สร้างทรัพยากร XML สําหรับทริกเกอร์เสียงใน
res/xml/<my_voice_trigger>.xml
สําหรับคําสั่งเสียงไม่เป็นสาธารณะ คุณควรใช้แอตทริบิวต์keyword
แทนแอตทริบิวต์command
ที่ใช้สําหรับคําสั่งเสียงที่ได้รับอนุมัติ แอตทริบิวต์keyword
ควรเป็นการอ้างอิงไปยังทรัพยากรสตริงที่กําหนดคําสั่งเสียง สําหรับทริกเกอร์เสียงง่ายๆ ที่เริ่มต้นกิจกรรมหรือบริการทันที เพียงระบุองค์ประกอบtrigger
ดังนี้<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
หากต้องการสร้างทริกเกอร์ด้วยเสียงที่แจ้งให้ผู้ใช้พูดวลีเพิ่มเติมก่อนเริ่มกิจกรรมหรือบริการ ให้ใส่องค์ประกอบอินพุตด้วย
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
การใช้คําสั่งเสียงตามบริบทที่ไม่เป็นสาธารณะ
เมื่อสร้างรายการในเมนู ให้ใช้ข้อความใดก็ได้สําหรับชื่อของรายการในเมนู เช่น
<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>
กําลังเริ่มการจดจําคําพูด
Glassware ที่จดจําคําพูดจะรอให้ผู้ใช้พูดและแสดงผล ข้อความที่ถอดเสียงหลังจากพูดเสร็จ วิธีเริ่มกิจกรรม
- โทร
startActivityForResult()
ด้วยความตั้งใจACTION_RECOGNIZE_SPEECH
ระบบรองรับเจตนาพิเศษต่อไปนี้เมื่อเริ่มต้นกิจกรรม ลบล้างการเรียกกลับ
onActivityResult()
เพื่อรับข้อความที่ถอดเสียงจากตัวเลือก Intent ของEXTRA_RESULTS
ระบบจะโทรกลับนี้เมื่อผู้ใช้พูดจบ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); }