النقر للقراءة في المساعد الصوتي

تعتبر 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 هذه المعلمات الثلاث:
  • args
  • showFlags
  • actions
تستخدم onShow هاتين المَعلمتَين:
  • args
  • showFlags

التغييرات في Android 10

بدءًا من Android 10، تطلب المنصة VoiceInteractionService.onGetSupportedVoiceActions لاكتشاف الإجراءات المتاحة. يلغي المساعد الصوتي لتنفيذ VoiceInteractionService.onGetSupportedVoiceActions، كما هو موضح في المثال التالي:

public class MyInteractionService extends VoiceInteractionService {
    private static final List SUPPORTED_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:

VOICE_ACTION_READ_NOTIFICATION

الشكل 2. مخطط تسلسل لـ VOICE_ACTION_READ_NOTIFICATION

في حالة الشكل 3، يُنصح بتطبيق حدود معدّل طلبات الأذونات:

VOICE_ACTION_REPLY_NOTIFICATION

الشكل 3. مخطط تسلسلي لـ VOICE_ACTION_REPLY_NOTIFICATION.

الصوت_إجراء_HANDLE_EXCEPTION

الشكل 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;
}