تعتبر Android Automotive أن الصوت مكوّن أساسي
وهي إحدى الطرق الأكثر أمانًا التي يمكن للمستخدمين من خلالها
للتفاعل مع نظام التشغيل Android Automotive أثناء القيادة. ونتيجة لذلك، قمنا بتوسيع
واجهات برمجة التطبيقات للمساعد الصوتي في Android (بما في ذلك VoiceInteractionSession
)
لتمكين المساعدين الصوتيين من تنفيذ المهام للمستخدمين
والتي قد يكون من الصعب إنجازها أثناء القيادة.
تمكِّن ميزة النقر للقراءة للمساعدين الصوتيين من قراءة الرسائل النصية والرد عليها من خلال
بالنيابة عن المستخدم، عندما يتفاعل المستخدم مع إشعارات الرسائل. لتوفير
هذه الوظيفة، فيمكنك دمج المساعد الصوتي مع
CarVoiceInteractionSession
في السيارات، تم تحديد الإشعارات المنشورة في "مركز الإشعارات"
باسم INBOX
أو INBOX_IN_GROUP
(مثل رسائل SMS) تتضمن
زر تشغيل: يمكن للمستخدم النقر على تشغيل لتحديد
يقرأ المساعد الصوتي الإشعار بصوت عالٍ، ويمكنك الرد اختياريًا عن طريق الصوت.
الشكل 1. إشعار "انقر للقراءة" مع الزر "تشغيل"
الدمج مع CarVoiceInteractionSession
توضّح الأقسام التالية كيفية دمج المساعد الصوتي مع
CarVoiceInteractionSession
دعم التفاعلات الصوتية
يجب على التطبيقات التي توفّر خدمات التفاعل الصوتي في السيارة
مع ميزة التفاعل الصوتي الحالية في Android للاطّلاع على مزيد من المعلومات، يمكنك مراجعة مساعد Google لأجهزة Android.
(باستثناء VoiceInteractionSession
). في حين أن جميع واجهات برمجة تطبيقات التفاعل الصوتي
العناصر كما هي على الأجهزة الجوّالة، CarVoiceInteractionSession
(الموضّح في تنفيذ CarVoiceInteractionSession) يستبدل
VoiceInteractionSession
لمزيد من المعلومات، يُرجى الاطّلاع على الصفحات التالية:
تنفيذ CarVoiceInteractionSession
CarVoiceInteractionSession
تعرض واجهات برمجة التطبيقات التي يمكنك استخدامها لتمكين المساعدين الصوتيين من قراءة الرسائل النصية بصوت عالٍ ثم
الرد على الرسائل نيابة عن المستخدم.
الفرق الرئيسي بين CarVoiceInteractionSession
و
VoiceInteractionSession
صفًا هو
تمريرة من "CarVoiceInteractionSession
" في الإجراء في "onShow
"
حتى يتمكّن المساعد الصوتي من اكتشاف سياق طلب المستخدم بمجرد
يبدأ CarVoiceInteractionSession
جلسة. مَعلمات onShow
لكل فئة مدرجة في الجدول التالي:
جلسة التفاعل مع السيارة عبر صوت السيارة | جلسة التفاعل الصوتي |
---|---|
تستخدم onShow هذه المعلمات الثلاث:
|
تستخدم onShow هاتين المَعلمتَين:
|
التغييرات في Android 10
بدءًا من Android 10، تطلب المنصة VoiceInteractionService.onGetSupportedVoiceActions
لاكتشاف الإجراءات المتاحة. يلغي المساعد الصوتي
لتنفيذ VoiceInteractionService.onGetSupportedVoiceActions
،
كما هو موضح في المثال التالي:
public class MyInteractionService extends VoiceInteractionService { private static final ListSUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION); @Override public Set onGetSupportedVoiceActions(@NonNull Set voiceActions) { Set result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } }
يتم توضيح الإجراءات الصالحة في الجدول التالي. للحصول على تفاصيل حول كل إجراء، يمكنك الاطّلاع على المخططات البيانية للتسلسلات:
الإجراء | الحمولة المتوقعة | الإجراء الصوتي المتوقّع |
---|---|---|
VOICE_ACTION_READ_NOTIFICATION |
قراءة الرسائل بصوت عالٍ للمستخدم ثم تنشيط علامة "مقروءة" في انتظار المراجعة العودة إلى عند قراءة الرسائل بنجاح. بشكل اختياري، يمكنك مطالبة المستخدم للرد. | |
VOICE_ACTION_REPLY_NOTIFICATION |
يمكن نقل العناصر باستخدام المفتاح.KEY_NOTIFICATION
يرتبط بـ StatusBarNotification .يتطلب android.permission.BIND_NOTIFICATION_LISTENER_SERVICE . |
اطلب من المستخدم ذكر رسالة الرد، ثم أدخِل رسالة الرد في
RemoteInputReply في الطلب الذي في انتظار المراجعة، ثم تنشيط
في انتظار المراجعة |
VOICE_ACTION_HANDLE_EXCEPTION |
سلسلة تتضمن مفتاحًاKEY_EXCEPTION
يرتبط بـ ExceptionValue
(على النحو الموضّح في قيم الاستثناء).KEY_FALLBACK_ASSISTANT_ENABLED التي ترتبط بقيمة منطقية. إذا كانت القيمة
هو true ، المساعد الاحتياطي الذي يمكنه التعامل مع طلب المستخدم
غير مفعّل. |
يتم تحديد الإجراء المتوقع اتخاذه بشأن الاستثناء في وثائق الاستثناء. |
قيم الاستثناء
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
للمساعد الصوتي لم يتم منحه إذن Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
وبأنّه يحصل على هذا الإذن من المستخدم.
طلب إذن أداة استماع الإشعارات
إذا لم يكن المساعد الصوتي التلقائي لديه أداة معالجة الإشعارات
الخاص بالنظام الأساسي، وهو FallbackAssistant
(إذا فعّلته الشركة المصنِّعة للسيارة) قد يقرأ الرسالة بصوت عالٍ قبل تفعيل المساعد الصوتي
إشعارًا لطلب الإذن. لتحديد ما إذا كانت FallbackAssistant
مفعّلة
قد قرأ المساعد الصوتي الرسالة، يجب أن يتحقّق من
KEY_FALLBACK_ASSISTANT_ENABLED
القيمة المنطقية في الحمولة.
تنصح المنصة بأن يضيف المساعد الصوتي منطق تحديد المعدل
عدد مرّات طلب هذا الإذن فإن القيام بذلك يحترم المستخدم الذي
أريد منح المساعد الصوتي هذا الإذن ويفضل
FallbackAssistant
لقراءة الرسائل النصية بصوت عالٍ. سيؤدي مطالبة
المستخدم على إذن في كل مرة يضغط فيها المستخدم على تشغيل في إشعار الرسالة
يمكن أن تكون تجربة مستخدم سلبية. لا تفرض المنصة حدودًا لسعر الصرف.
نيابةً عن المساعد الصوتي.
عند طلب إذن أداة معالجة الإشعارات، يجب على المساعد الصوتي
يمكنك استخدام CarUxRestrictionsManager
لتحديد ما إذا كان المستخدم يرقد في السيارة أو يقود سيارته. إذا كان المستخدم يقود سيارته، يتم استخدام المساعد الصوتي
عرض إشعار يقدم إرشادات عن كيفية منح الإذن. إجراء ذلك
يساعد (ويذكّر) المستخدم بمنح الإذن عندما يكون أكثر أمانًا.
استخدام StatusBarNotification
تم تمرير "StatusBarNotification
" باستخدام ميزة "القراءة والرد"
تكون الإجراءات الصوتية دائمًا في إشعار مراسلة متوافق مع السيارة على النحو الموضَّح.
في إشعار
مستخدمي الرسائل على الرغم من أن بعض الإشعارات قد لا تتضمن رسالة الرد في انتظار المراجعة
النية، لديهم جميعًا وضع علامة "مقروءة" على نواياه في انتظار المراجعة.
لتبسيط التفاعلات مع الإشعارات، يمكنك استخدام NotificationPayloadHandler
توفر طرقًا لاستخراج الرسائل من الإشعار وكتابة
الرد على الرسائل بالغرض المناسب من الإشعار المرصود. بعد
يقرأ المساعد الصوتي الرسالة، يجب أن يطلق المساعد الصوتي علامة
مثل "الرغبة في القراءة".
تلبية الشروط المسبقة لميزة "النقر للقراءة"
VoiceInteractionSession
فقط من الصوت التلقائي
يتم إرسال إشعار إلى "مساعد Google" عندما يشغّل المستخدم الإجراء الصوتي للقراءة
الرد على الرسائل. كما ذكرنا أعلاه، يجب أيضًا أن يكون هذا المساعد الصوتي التلقائي
الحصول على إذن أداة استماع الإشعارات
المخططات البيانية للتسلسلات
تعرض هذه الأشكال التدفقات المنطقية لـ CarVoiceInteractionSession actions
:
الشكل 2. مخطط تسلسل لـ VOICE_ACTION_READ_NOTIFICATION
في حالة الشكل 3، يُنصح بتطبيق حدود معدّل طلبات الأذونات:
الشكل 3. مخطط تسلسلي لـ VOICE_ACTION_REPLY_NOTIFICATION.
الشكل 4. مخطط التسلسل لـ VOICE_ACTION_HANDLE_EXCEPTION.
قراءة اسم التطبيق
إذا أردت أن يقرأ المساعد الصوتي اسم تطبيق المراسلة بصوت عالٍ أثناء قراءة الرسالة (على سبيل المثال، "قال سام من Hangouts...")، عليك إنشاء دالة على النحو الموضّح في مثال الرمز التالي للتأكّد من قراءة المساعد للاسم الصحيح:
@Nullable String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) { ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName()); if (info == null) return null; Notification notification = statusBarNotification.getNotification(); // Sometimes system packages will post on behalf of other apps, so check this // field for a system app notification. if (isSystemApp(info) && notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) { return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME); } else { PackageManager pm = context.getPackageManager(); return String.valueOf(pm.getApplicationLabel(info)); } } @Nullable ApplicationInfo getApplicationInfo(Context context, String packageName) { final PackageManager pm = context.getPackageManager(); ApplicationInfo info; try { info = pm.getApplicationInfo(packageName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } return info; } boolean isSystemApp(ApplicationInfo info) { return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; }