إنشاء تجارب مراسلة مستندة إلى النماذج لنظام التشغيل Android Auto

تتوفّر تجارب المراسلة المستندة إلى نماذج في إصدار تجريبي
في الوقت الحالي، يمكن لأي شخص نشر تطبيقات تواصل تتضمّن تجارب مراسلة مستندة إلى نماذج في مسارات الاختبار الداخلي والاختبار المغلق على "متجر Play". سيُسمح بالنشر على مسارات الاختبار المفتوح وقناة الإصدار العلني في وقت لاحق.

بالإضافة إلى تجربة المراسلة الأساسية المستندة إلى الإشعارات لقراءة الرسائل والرد عليها، يتيح Android Auto تجارب مراسلة أكثر تفصيلاً تم إنشاؤها باستخدام مكتبة تطبيقات Android للسيارات.

توفير تجارب مراسلة تستند إلى الإشعارات

يجب أيضًا أن تتيح جميع التطبيقات التي توفّر تجارب مراسلة مستندة إلى نماذج إشعارات المراسلة في Android Auto. تتيح هذه الميزة للمستخدمين قراءة الرسائل والرد عليها بدون الحاجة إلى فتح التطبيق المستند إلى نموذج.

إنشاء تجربة مراسلة مستندة إلى نماذج

اتّبِع الإرشادات الواردة في استخدام مكتبة تطبيقات "Android للسيارات" وإضافة دعم Android Auto إلى تطبيقك المستند إلى نماذج لبدء إنشاء تجربة تطبيقك المستندة إلى نماذج. بعد ذلك، راجِع الإرشادات الواردة في هذه الصفحة للتعرّف على المتطلبات المحدّدة لتطبيقات المراسلة المستندة إلى نماذج.

ضبط ملفات بيان تطبيقك

لإعلام Android Auto بإمكانات تطبيقك، يجب أن يتضمّن تطبيقك ما يلي:

تحديد الفئات المتوافقة في البيان

يجب أن يعرِّف تطبيقك androidx.car.app.category.MESSAGING فئة تطبيق السيارة في فلتر الأهداف الخاص بـ CarAppService.

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MESSAGING"/>
      </intent-filter>
    </service>
    ...
<application>

تحديد الحد الأدنى لمستوى واجهة برمجة التطبيقات لتطبيقات السيارات

بما أنّ واجهة برمجة التطبيقات ConversationItem لا تتوافق إلا مع الإصدار 7 من Car API أو الإصدارات الأحدث، عليك أيضًا ضبط البيانات الوصفية minCarApiLevel على هذه القيمة. لمزيد من المعلومات، يمكنك الاطّلاع على مستوى Car App API.

<application ...>
    ...
    <meta-data
        android:name="androidx.car.app.minCarApiLevel"
        android:value="7"/>
    ...
</application>

تحديد إمكانية استخدام التطبيق مع Android Auto

في ملف automotive_app_desc.xml الذي تستخدمه لتحديد إمكانية استخدام Android Auto، تأكَّد من تحديد كل من إمكانية notification وإمكانية template:

<automotiveApp>
    <uses name="notification" />
    <uses name="template" />
</automotiveApp>

إذا كان يمكن ضبط تطبيقك كمعالج تلقائي للرسائل القصيرة، تأكَّد من تضمين عنصر <uses> التالي. وفي حال عدم توفيرها، سيتم استخدام معالج تلقائي مضمّن في Android Auto للتعامل مع رسائل SMS/MMS الواردة، ما قد يؤدي إلى تلقّي إشعارات مكرّرة.

<automotiveApp>
    ...
    <uses name="sms" />
</automotiveApp>

عرض المحادثات

لعرض نظرة عامة على محادثات المستخدم، يمكنك عرض قائمة بعناصر ConversationItem في ListTemplate أو SectionedItemTemplate.

لتقديم تجربة جيدة للمستخدم، ننصحك بتوفير 5 إلى 10 محادثات على الأكثر من بين المحادثات الأحدث أو الأكثر أهمية، مع عدم تجاوز 5 رسائل من بين الرسائل الأحدث لكل محادثة. يساعد ذلك في تحسين أداء التحميل، ويتيح للمستخدمين الاطّلاع على المحتوى الأكثر صلة، ويقلّل من وقت التفاعل.

class MyMessagingScreen() : Screen() {

    override fun onGetTemplate(): Template {
        val itemListBuilder = ItemList.Builder()
        val conversations: List<MyConversation> = // Retrieve conversations

        for (conversation: MyConversation in conversations) {
            val carMessages: List<CarMessage> = conversation.getMessages()
                .map { message ->
                    // CarMessage supports additional fields such as MIME type and URI,
                    // which you should set if available
                    CarMessage.Builder()
                        .setSender(message.sender)
                        .setBody(message.body)
                        .setReceivedTimeEpochMillis(message.receivedTimeEpochMillis)
                        .setRead(message.isRead)
                        .build()
                }

            itemListBuilder.addItem(
                ConversationItem.Builder()
                    .setConversationCallback { /* Implement your conversation callback logic here */ }
                    .setId(/* Set conversation ID */)
                    .setTitle(/* Set conversation title */)
                    .setIcon(/* Set conversation icon if available */)
                    .setMessages(carMessages)
                    /* When the sender of a CarMessage is equal to this Person,
                    message readout is adjusted to "you said" instead of "<person>
                    said" */
                    .setSelf(/* Set self-sender */)
                    .setGroupConversation(/* Set if the message contains more than 2 participants */)
                    .build()
            )
        }

        return ListTemplate.Builder()
            .setTitle("Conversations")
            .setHeaderAction(Action.APP_ICON)
            .setSingleList(itemListBuilder.build())
            .build()
    }
}

تعرض كل ConversationItem تلقائيًا إجراءات لتشغيل رسالة وتمييزها كمقروءة والرد عليها. تتم معالجة هذه الإجراءات من خلال ConversationCallbackDelegate الذي تقدّمه عند إنشاء ConversationItem.

إذا كان تطبيقك يوفّر اختصارات للمحادثات، تأكَّد من أنّ المعرّف المقدَّم عند إنشاء ConversationItem هو نفسه المعرّف الخاص باختصار المحادثة.

تعديل المحادثات

عندما يرسل المستخدمون الرسائل ويتلقّونها، عليك إعادة تحميل شاشات تطبيقك لتضمين الرسائل الجديدة من خلال استدعاء invalidate(). تعديل محتوى نموذج

للحصول على أفضل تجربة للمستخدم، ننصحك بأن لا تتجاوز مدة إعادة التحميل 500 ملي ثانية. إذا استغرق التحديث المتكرّر وقتًا أطول، يمكنك عرض حالة تحميل أثناء تحميل الرسائل الواردة.

ضبط أهمية الإشعارات بشكل مناسب

للحدّ من عوامل التشتيت، يجب أن يخفّض تطبيقك من أهمية الإشعارات الواردة عندما يكون المستخدم يشاهد محادثة ذات صلة، وذلك حتى لا تظهر الإشعارات كإشعارات عاجلة.

يمكنك تتبُّع ما إذا كانت المحادثة مرئية من خلال مراقبة مراحل نشاط Screen التي تعرضها. اطّلِع على دورة حياة الشاشة.

لمنع ظهور إشعار كإشعار عالي الأولوية، اضبط الأولوية على IMPORTANCE_DEFAULT أو أقل.

توزيع تطبيقات المراسلة المستندة إلى نماذج

بما أنّه لا يمكن نشر التطبيقات التي تتيح تجارب المراسلة المستندة إلى نماذج إلا في مسارَي "الاختبار الداخلي" و"الاختبار المغلق" على Google Play، يجب عدم الترويج للإصدارات التي تتضمّن إمكانية استخدام هذه الميزة في مسارَي "الاختبار المفتوح" و"الإصدار العلني"، لأنّه سيتم رفض عمليات الإرسال التي تتضمّن إصدارات في هذين المسارين.