1. قبل البدء
من الصعب إنشاء تطبيق مراسلة. على الرغم من أنّ تجربة المستخدم بشكل عام تعتمد على التجربة الذاتية، يوفّر Android واجهتَي برمجة تطبيقات المراسلة والأشخاص لتحسين تجربة الدردشة وتبسيطها.
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام واجهات برمجة التطبيقات هذه لإنشاء منظومة متكاملة وجذابة لتطبيقات المحادثات على Android. يمكنك توسيع نطاق تطبيق JetChat، وهو تطبيق دردشة بسيط وغير يعمل يستخدم ميزة إنشاء Jetpack.
المتطلبات الأساسية
- معرفة أساسية بتطوير تطبيقات Android
- معرفة أساسية بالإشعارات
ما الذي ستنشئه
تطبيق JetChat الموسَّع الذي ينفّذ ما يلي:
- يؤدي هذا الإعداد إلى عرض الإشعارات التي تمثّل المحادثات في قسم المحادثات المحجوزة في درج الإشعارات.
- تشارك المراجع الأهداف في هذه الإشعارات والتي تتيح لك المشاركة في محادثات تطبيقك.
- تتيح فرض أفضل الممارسات لإنشاء هذه العناصر للاستفادة من التجارب التلقائية التي يوفّرها النظام لتحسين تطبيقك.
المعلومات التي ستطّلع عليها
- كيفية عرض الإشعارات المتعلّقة بالمحادثات في قسم المحادثات المحجوزة في درج الإشعارات
- كيفية فهم التجارب المتنوعة التي تفعِّلها واجهتا برمجة تطبيقات المراسلة والأشخاص.
المتطلبات
- Git
- استوديو Android
- حساب GitHub
2. الإعداد
تستند نقطة البداية إلى تطبيق JetChat. يعمل رمز إجراء التفعيل على توسيع نطاق تطبيق JetChat لعرض واجهتَي برمجة تطبيقات المراسلة وPeople بشكل أفضل.
الحصول على رمز إجراء التفعيل
للحصول على رمز التفعيل الخاص بهذا الدرس التطبيقي حول الترميز، اتّبِع الخطوات التالية:
- من سطر الأوامر، استنساخ مستودع جيت هب التالي:
git clone –branch starter-code \ https://github.com/android/people-messaging-codelab.git
- افتح المشروع في "استوديو Android" ثم انقر على
تشغيل التطبيق. تظهر لوحة المحاكي وتعرض التطبيق.
استكشِف تطبيق JetChat الموسّع
- في مربّع النص Message #composers على التطبيق، أدخِل رسالة ثم انقر على إرسال.
- الانتقال بعيدًا عن التطبيق بعد بضع ثوانٍ، ستتلقّى إشعارًا فوريًا يحتوي على ردّ من شخص في المحادثة.
3- إنشاء إشعارات المحادثات
تم تقديم واجهات برمجة تطبيقات في نظام التشغيل Android تسمح بظهور الإشعارات المتعلّقة بالمحادثات في قسم معيّن ضمن درج الإشعارات، والتي تقتصر على المحادثات.
يجب أن يكون الإشعار من فئة Notification.MessagingStyle
وأن يشير إلى اختصار مشاركة طويل الأجل. ستتعرّف في هذا القسم على كيفية استيفاء متطلّبات واجهة برمجة التطبيقات هذه لعرض هذه الإشعارات التي تمثّل المحادثات في قسم المحادثات.
لإرسال إشعارات من الصف NotificationCompat.MessagingStyle
، يُرجى اتّباع الخطوات التالية:
- في علامة التبويب المشروع ضمن "استوديو Android"، انقر على
app
>.java
>com.example.compose.jetchat
>conversation
ثم انقر مرّتين علىConversationFragment
. - في الملف
ConversationFragment.kt
، ابحث عن الفئةConversationFragment
، ثم ابحث عن مجموعة الرموزNotification
الخاصة بدالةcreateNotification
والتي تم إنشاء الإشعار فيها. - استبدِل طريقة
setContentText
بطريقةsetStyle
التي تضبط نمط الإشعار على الفئةNotificationCompat.MessagingStyle
. تضيف فئة المساعدة هذه الرسالة التي تم ضبطها باستخدام طريقةsetContextText
مع سياق إضافي ذي صلة بالرسالة، مثل وقت إرسالها والشخص الذي أرسلها.
ConversationFragment.kt
private fun createNotification(
notificationId: Int,
message: Message,
person: Person,
shortcut: ShortcutInfoCompat,
time: Long
): Notification? {
...
.setStyle(NotificationCompat.MessagingStyle(person).addMessage(
NotificationCompat.MessagingStyle.Message(
message.content,
time,
person
)
)
)
...
.build()
}
تشغيل التطبيق
- شغِّل التطبيق.
- في مربّع النص Message #composers على التطبيق، أدخِل رسالة ثم انقر على إرسال.
- الانتقال بعيدًا عن التطبيق ستتلقّى إشعارًا فوريًا مرة أخرى، ولكن بتصميم مختلف. وتتضمن صورة رمزية ونمطًا مميزًا للرسالة. ومع ذلك، هناك المزيد من الإجراءات التي عليك اتّخاذها قبل ظهور الإشعارات في المكان الذي من المفترض أن تظهر فيه.
4. إنشاء أهداف المشاركة للمحادثات
يجب الإشارة إلى اختصار مشاركة أو مشاركة هدف في الإشعار. يتم تحديد أهداف المشاركة في ملف shortcuts.xml
وهي نقاط الدخول إلى الاختصارات التي يتم تحديدها آليًا. تمثّل الاختصارات التي تنشئها المحادثات في التطبيق، وتسمح لك بمشاركة المحتوى في محادثاتك.
تحديد أهداف المشاركة
- في علامة التبويب المشروع، انقر بزر الماوس الأيمن على الدليل
res
ثم اختَر جديد > الدليل. - في مربّع النص، أدخِل
xml
، ثم اضغط علىEnter
(أوreturn
على نظام التشغيل macOS). - انقر بزر الماوس الأيمن على الدليل
xml
، ثم اختَر ملف. - في مربّع النص، أدخِل
shortcuts.xml
، ثم اضغط علىEnter
(أوreturn
على نظام التشغيل macOS). - في الملف
shortcuts.xml
، اذكر هدف المشاركة الذي يعالج مشاركة البيانات من النوعtext/plain
:
shortcuts.xml
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<share-target android:targetClass="com.example.compose.jetchat.NavActivity">
<data android:mimeType="text/plain" />
<category android:name="com.example.compose.jetchat.share.TEXT_SHARE_TARGET" />
</share-target>
</shortcuts>
- في علامة التبويب المشروع، انقر على
manifests
ثم انقر مرّتين على الرمزAndroidManifest.xml
. - في ملف
AndroidManifest.xml
، حدِّد الملفshortcuts.xml
:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compose.jetchat">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Jetchat.NoActionBar">
...
<meta-data android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</application>
</manifest>
- في المكوِّن
activity
لملفAndroidManifest.xml
، حدِّد فلتر الأهداف الذي يحتوي على منطق المشاركة:
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compose.jetchat">
...
<activity
...
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
...
تحديد الاختصارات
عليك ربط الاختصار ذي الصلة لكل إشعار. يمكنك تحديد اختصار فريد واحد فقط لكل محادثة لأن الاختصار الفريد يمثل جهة الاتصال الواحدة التي تريد المشاركة معها.
لإنشاء اختصار، اتبع الخطوات التالية:
- في علامة التبويب المشروع، انقر على
app
>.java
>com.example.compose.jetchat
>conversation
>util
ثم انقر مرّتين على الرمزConversationUtil
. - في ملف
ConversationUtil.kt
، أضِف الدالةgenerateShortcut
:
ConversationUtil.kt
import android.content.Intent
import androidx.core.content.pm.ShortcutInfoCompat
import com.example.compose.jetchat.NavActivity
class ConversationUtil {
companion object {
...
fun generateShortcut(context: Context, shortcutId: String): ShortcutInfoCompat {
return ShortcutInfoCompat.Builder(context, shortcutId)
.setCategories(setOf(CATEGORY_SHARE))
.setLongLived(true)
.setShortLabel(shortcutId)
.setLongLabel(shortcutId)
.setIntent(
Intent(context, NavActivity::class.java)
.setAction(Intent.ACTION_VIEW)
)
.build()
}
تحتوي هذه الدالة على الطريقتين setPerson
وsetLongLived
المطلوبتين للمحادثة. المستخدم هو جهة الاتصال المرتبطة بالاختصار، ويؤدي ضبط فترة طويلة على قيمة true
إلى ضمان أن يتم تخزين هذا الاختصار مؤقتًا في النظام وعرضه على مساحات عرض مختلفة في واجهة المستخدم.
يُرجى الرجوع إلى الاختصار في الإشعار.
وعليك الرجوع إلى اختصار المشاركة في الإشعار. ومع ذلك، يجب إنشاء الاختصار قبل إرسال الإشعار.
ولإجراء ذلك، اتبع الخطوات التالية:
- في ملف
ConversationFragment.kt
، ابحث عن الصفConversationFragment
. - قبل استدعاء المتغيّر
notification
، أنشِئ متغيّرshortcut
يشير إلى الاختصار الذي تم إنشاؤه منConversationUtil.generateShortcut
. - في طريقة
createNotification
للمتغيّرnotification
، استبدِلnull
بالمتغيّرshortcut
كمَعلمة.
ConversationFragment.kt
private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
val shortcut = ConversationUtil.generateShortcut(context!!, message.author)
val notification = createNotification(notificationId, message, person, shortcut, time)
...
}
}
- في الطريقة
createNotification
، أضِف الطريقةNotificationCompat.Builder#setShortcutInfo
، ثم أدخِل المتغيّرshortcut
كمَعلمة.
ConversationFragment.kt
private fun createNotification(
notificatoinIf: Int,
messagin: Message,
person: Person,
shortcut: ShortcutInfoCompat?,
time: Long
): Notification {
...
return NotificationCompat.Builder(context!!, ConversationUtil.CHANNEL_MESSAGES)
...
.setShortcutInfo(shortcut)
.build()
}
نشر الاختصار
- لنشر الاختصار، في الدالة
simulateResponseAsANotification
قبل طريقةnotificationManager.notify
، يمكنك استدعاء طريقةpushDynamicShortcut
:
ConversationFragment.kt
import androidx.core.content.pm.ShortcutManagerCompat
...private fun simulateResponseAsANotification() {
...
if (message.author != "me") {
...
ShortcutManagerCompat.pushDynamicShortcut(context!!, shortcut)
...
}
}
تشغيل التطبيق
- شغِّل التطبيق.
- في مربّع النص Message #composers على التطبيق، أدخِل رسالة ثم انقر على إرسال.
- الانتقال بعيدًا عن التطبيق تتلقى إشعارًا فوريًا مرة أخرى، ولكن نمطه أكثر وضوحًا كإشعار متعلق بالمحادثة. يكون رمز الأفاتار أكثر وضوحًا ويدمج رمز التطبيق. ويكون المرسل والوقت والنص أيضًا أكثر سلاسة.
5- اختياري: تفعيل الفقاعات التفسيرية
تم طرح فقاعات المحادثات في الإصدار 9 من نظام Android، وتم تحسينها وإعادة استخدامها في سياق المحادثات في الإصدار 11 من نظام Android. الفقاعات التفسيرية عبارة عن طبقات دائرية على شكل صور رمزية لمحادثاتك. وهي تظهر في مشغّل التطبيقات، وتتيح لك الرد بسهولة على المحادثات من خلال فقاعة تفسيرية موسّعة. وحتى عند تنفيذ الفقاعات التفسيرية، تكون اختيارية بناءً على ما يفضّله المستخدم.
لتفعيل الفقاعات التفسيرية، يُرجى اتّباع الخطوات التالية:
- في ملف
AndroidManifest.xml
، أضِف السمتَينallowEmbedded
وresizeableActivity
، ثم اضبط كلّ منهما على قيمةtrue
:
AndroidManifest.xml
<activity
...
android:allowEmbedded="true"
android:resizeableActivity="true"
...
</activity>
- في الصف
ConversationUtil
الخاص بملفConversationUtil.kt
، أضِف البيانات الوصفية للفقاعات التفسيرية:
ConversationUtil.kt
import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.IconCompat
fun createBubbleMetadata(context: Context, icon: IconCompat): NotificationCompat.BubbleMetadata {
// Create bubble intent
val target = Intent(context, NavActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, REQUEST_BUBBLE, target, flagUpdateCurrent(mutable = true))
// Create bubble metadata
return NotificationCompat.BubbleMetadata.Builder(bubbleIntent, icon)
.setDesiredHeight(400)
.setSuppressNotification(true)
.build()
}
- في ملف
ConversationFragment.kt
، أنشئ البيانات الوصفية للفقاعة التفسيرية وأشِر إليها في الإشعار:
ConversationFragment.kt
private fun createNotification(
notificatoinIf: Int,
messagin: Message,
person: Person,
shortcut: ShortcutInfoCompat?,
time: Long
): Notification {
...
// Reference the bubble metadata in the notification.
return NotificationCompat.Builder(context!!, ConversationUtil.CHANNEL_MESSAGES)
...
.setBubbleMetadata(ConversationUtil.createBubbleMetadata(context!!, person.icon!!))
...
.build()
}
تشغيل التطبيق
- شغِّل التطبيق.
- في مربّع النص Message #composers على التطبيق، أدخِل رسالة ثم انقر على إرسال.
- الانتقال بعيدًا عن التطبيق بعد بضع ثوانٍ، ستتلقّى إشعارًا من المحادثة على شكل فقاعة.
- انقر على الفقاعة. تفتح المحادثة من الفقاعة التفسيرية.
6- اختياري: مشاركة رابط
لقد أعلنت عن أهداف المشاركة وأشرت إليها في الإشعارات، ما أتاح أيضًا عرض جهة الاتصال في "قائمة مشاركة البيانات"، وهو مكوّن من أسفل إلى أعلى يظهر عند إرسال هدف ACTION
. تظهر أهداف المشاركة أعلى "قائمة المشاركة"، وتسمح لك بمشاركة محتوى وافٍ في محادثاتك.
لاستدعاء ورقة المشاركة، اتبع الخطوات التالية:
- على جهازك، افتح Google Chrome، ثم انتقِل إلى صفحة ويب من اختيارك، مثل developer.android.com.
- إذا لزم الأمر، انقر على
مزيد من الصفحة.
- انقر على رمز مشاركة
. تظهر ورقة المشاركة أسفل الشاشة.
- انقر على
JetChat إن أمكن. تتم مشاركة عنوان URL في المحادثة.
- إذا لم يظهر لك
JetChat، انقر على
المزيد لاستدعاء "قائمة مشاركة النظام"، ثم مرِّر سريعًا للأعلى على ShareSheet وانقر على
JetChat. وتتم مشاركة عنوان URL في المحادثة.
يعد ذلك مثالاً بسيطًا. هناك أنواع أكثر ثراءً من المحتوى يمكن مشاركتها. لمزيد من المعلومات، يُرجى الاطّلاع على استرداد البيانات البسيطة من التطبيقات الأخرى.
7. تهانينا
تهانينا! لقد تعرفت الآن على كيفية إضافة الميزات المتعلقة بالمحادثة إلى تطبيق Android باستخدام واجهتَي برمجة تطبيقات المراسلة والأشخاص. مراسلة سعيدة!