إنشاء تجارب مراسلة مستندة إلى النماذج لنظام التشغيل 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 من واجهة برمجة التطبيقات لتطبيقات السيارات أو الإصدارات الأحدث، عليك أيضًا ضبط بيانات minCarApiLevel الوصفية على هذه القيمة. لمزيد من المعلومات، يُرجى الاطّلاع على المقالة مستوى واجهة برمجة التطبيقات لتطبيقات السيارات.

<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>

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

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

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

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

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

class MyMessagingScreen(carContext: CarContext) : Screen(carContext) {
    override fun onGetTemplate(): Template {
        val itemListBuilder = ItemList.Builder()
        val conversations: List<MyConversation> = getConversations() // 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(
                    conversation.id,
                    CarText.create(conversation.title),
                    Person.Builder()
                        .setName("Me")
                        .setKey("self_id")
                        .build(),
                    carMessages,
                    myConversationCallback
                )
                    .build()
            )
        }

        val header = Header.Builder()
            .setStartHeaderAction(Action.APP_ICON)
            .setTitle("Conversations")
            .build()

        return ListTemplate.Builder()
            .setHeader(header)
            .setSingleList(itemListBuilder.build())
            .build()
    }
}

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

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

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

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

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

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

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

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

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

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

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