مساعد صوت اضغط للقراءة

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

التغييرات في أندرويد 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 الخاصة بالمساعد الصوتي الافتراضي فقط عندما يقوم المستخدم بتشغيل الإجراء الصوتي لقراءة الرسائل والرد عليها. كما ذكرنا أعلاه، يجب أن يتمتع المساعد الصوتي الافتراضي أيضًا بإذن مستمع الإشعارات.

المخططات التسلسلية

تعرض هذه الأشكال التدفقات المنطقية CarVoiceInteractionSession actions :

VOICE_ACTION_READ_NOTIFICATION

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

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

VOICE_ACTION_REPLY_NOTIFICATION

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

VOICE_ACTION_HANDLE_EXCEPTION

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