تعتبر Android Automotive الصوت عنصرًا حاسمًا للتفاعلات الآمنة أثناء القيادة وأحد أكثر الطرق أمانًا للمستخدمين للتفاعل مع نظام التشغيل Android Automotive أثناء القيادة. ونتيجة لذلك، قمنا بتوسيع واجهات برمجة تطبيقات المساعد الصوتي لنظام Android (بما في ذلك VoiceInteractionSession
) لتمكين المساعدين الصوتيين من أداء المهام للمستخدمين التي قد يكون من الصعب إنجازها أثناء القيادة.
يتيح النقر للقراءة للمساعدين الصوتيين قراءة الرسائل النصية والرد عليها نيابة عن المستخدم، عندما يتفاعل المستخدم مع إشعارات الرسائل. لتوفير هذه الوظيفة، يمكنك دمج مساعد صوتي مع CarVoiceInteractionSession
.
في السيارات، تتضمن الإشعارات المرسلة إلى مركز الإشعارات والمعروفة باسم INBOX
أو INBOX_IN_GROUP
(على سبيل المثال، رسائل SMS) زر تشغيل . يمكن للمستخدم النقر فوق "تشغيل" ليقوم المساعد الصوتي المحدد بقراءة الإشعارات بصوت عالٍ، وللرد صوتيًا بشكل اختياري.
الشكل 1. إشعار النقر للقراءة باستخدام زر التشغيل.
التكامل مع جلسة CarVoiceInteraction
تصف الأقسام التالية كيفية دمج المساعد الصوتي مع CarVoiceInteractionSession
.
دعم التفاعلات الصوتية
يجب أن تتكامل التطبيقات التي توفر خدمات التفاعل الصوتي للسيارة مع التفاعلات الصوتية الحالية لنظام Android. لمعرفة المزيد، راجع مساعد Google لنظام Android (باستثناء VoiceInteractionSession
). على الرغم من أن جميع عناصر واجهة برمجة التطبيقات للتفاعل الصوتي تظل كما هي كما هي مطبقة على الأجهزة المحمولة، CarVoiceInteractionSession
(الموصوف في Implement CarVoiceInteractionSession ) تحل محل VoiceInteractionSession
. لمزيد من المعلومات، راجع هذه الصفحات:
تنفيذ جلسة CarVoiceInteraction
يعرض CarVoiceInteractionSession
واجهات برمجة التطبيقات التي يمكنك استخدامها لتمكين المساعدين الصوتيين من قراءة الرسائل النصية بصوت عالٍ ثم الرد على هذه الرسائل نيابة عن المستخدم.
يتمثل الاختلاف الرئيسي بين فئتي CarVoiceInteractionSession
و VoiceInteractionSession
في أن CarVoiceInteractionSession
يمر في الإجراء في onShow
حتى يتمكن المساعد الصوتي من اكتشاف سياق طلب المستخدم بمجرد بدء جلسة CarVoiceInteractionSession
. يتم سرد معلمات onShow
لكل فئة في الجدول التالي:
CarVoiceInteractionSession | جلسة التفاعل الصوتي |
---|---|
يأخذ onShow هذه المعلمات الثلاث :
| يأخذ onShow هاتين المعلمتين:
|
التغييرات في أندرويد 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
الخاصة بالمساعد الصوتي الافتراضي فقط عندما يقوم المستخدم بتشغيل الإجراء الصوتي لقراءة الرسائل والرد عليها. كما ذكرنا أعلاه، يجب أن يتمتع المساعد الصوتي الافتراضي أيضًا بإذن مستمع الإشعارات.
المخططات التسلسلية
تعرض هذه الأشكال التدفقات المنطقية CarVoiceInteractionSession actions
:
الشكل 2. مخطط تسلسلي لـ VOICE_ACTION_READ_NOTIFICATION.
في حالة الشكل 3، يوصى بتطبيق حدود المعدل على طلبات الأذونات:
الشكل 3. مخطط تسلسلي لـ VOICE_ACTION_REPLY_NOTIFICATION.
الشكل 4. مخطط تسلسلي لـ VOICE_ACTION_HANDLE_EXCEPTION.
قراءة اسم التطبيق
إذا كنت تريد أن يقرأ المساعد الصوتي اسم تطبيق المراسلة بصوت عالٍ أثناء قراءة الرسالة (على سبيل المثال، "قال Sam من 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; }