يتيح لك الإدخال الصوتي إنشاء واجهة بدون لمس الجهاز. زجاج ثلاث طرق لاستخدام الإدخال الصوتي.
تبدأ الأوامر الصوتية الرئيسية في Glassware من بطاقة Home، والصوت السياقي ويمكن للأوامر تنفيذ الإجراءات داخل النشاط، كما أن كلام النظام يتيح لك نشاط التعرف على إدخال صوتي حر الشكل من المستخدمين.
الطلبات الصوتية الرئيسية
تتيح هذه الطلبات الصوتية تشغيل Glassware من بطاقة Home (بطاقة الساعة). عندما تريد للإشارة إلى طلب صوتي رئيسي، ينشئ Glass تلقائيًا عنصر قائمة باللمس كإجراء احتياطي إذا قرر المستخدمون بدء Glassware بالنقر على بطاقة الصفحة الرئيسية
لإضافة طلب صوتي إلى القائمة الرئيسية بصوت OK Glass، اتّبِع الخطوات التالية:
إنشاء مورد 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>
تسجيل فلتر أهداف باستخدام إجراء "
com.google.android.glass.action.VOICE_TRIGGER
" في ملف بيان Android. يبدأ فلتر الأهداف نشاطك أو خدمتك. في حال رصد مستخدمين يتحدّثون بطلبك الصوتي<?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); // ... }
ضبط القيود
إذا كنت بحاجة إلى إحدى الميزات التالية أو جميعها لبدء تشغيل Glassware،
عليك تحديدها في مورد "res/xml/<my_voice_trigger>.xml
".
وإذا لم تكن الميزات متاحة، يوقف Glass الطلب الصوتي:
camera
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
الطلبات الصوتية السياقية
تسمح الأوامر الصوتية السياقية للمستخدمين بتنفيذ إجراءات من الأنشطة. يمكنك إنشاء أوامر صوتية سياقية باستخدام واجهات برمجة التطبيقات القياسية لقائمة 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 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>
(اختياري) إلغاء
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); }
إتاحة قوائم الصوت واللمس في الوقت نفسه
ولأن الأوامر الصوتية السياقية تستخدم واجهات برمجة التطبيقات الحالية لقائمة Android، يمكنك إعادة استخدام الكثير من التعليمات البرمجية والموارد التي لديك بالفعل لقوائم اللمس وتدعم في وقت واحد كلا النوعين من القوائم.
ما عليك سوى التحقّق من ميزة "Window.FEATURE_OPTIONS_PANEL
"
بالإضافة إلى ميزة WindowUtils.FEATURE_VOICE_COMMANDS
التي تستخدمها
والتحقق بعدة طرق ثم إضافة المنطق لفتح اللمس
قائمة بإجراءات المستخدم، مثل النقر.
على سبيل المثال، يمكنك تغيير النشاط السابق مثال لإضافة دعم لقوائم اللمس مثل هذه (يتم التعليق على التغييرات):
// 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
. تتوفّر عناصر intent الإضافية التالية عند بدء النشاط: إلغاء
onActivityResult()
لتلقي النص المكتوب من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); }