تنفيذ الرسائل الفورية

يقدّم نظام التشغيل Android 9 واجهة SystemApi جديدة تُسمى ImsService لمساعدتك في تنفيذ نظام IP Multimedia Subsystem (IMS). واجهة برمجة التطبيقات ImsService API هي واجهة محدّدة جيدًا بين نظام Android الأساسي وتنفيذ IMS الذي يقدّمه المورّد أو شركة الجوّال.

نظرة عامة على ImsService

الشكل 1: نظرة عامة على ImsService

باستخدام واجهة ImsService، يمكن لمنفِّذ IMS تقديم معلومات مهمة عن الإشارات إلى المنصة، مثل معلومات تسجيل IMS ورسائل SMS التي يتم دمجها عبر IMS ودمج ميزة MmTel لتوفير مكالمات voice and video. واجهة برمجة التطبيقات ImsService API هي أيضًا واجهة برمجة تطبيقات لنظام Android، ما يعني أنّه يمكن إنشاؤها باستخدام حزمة تطوير البرامج (SDK) لنظام Android مباشرةً بدلاً من استخدام المصدر. يمكن أيضًا ضبط تطبيق IMS الذي تم تثبيته مسبقًا على الجهاز ليصبح قابلاً للتحديث من خلال "متجر Play".

الأمثلة والمصدر

يوفّر Android تطبيقًا على AOSP ينفّذ أجزاءً من ImsService API لأغراض الاختبار والتطوير. يمكنك العثور على التطبيق على /testapps/ImsTestService.

يمكنك العثور على مستندات واجهة برمجة التطبيقات ImsService API في ImsService وفي الفئات الأخرى في واجهة برمجة التطبيقات.

التنفيذ

‫ImsService API هي واجهة برمجة تطبيقات عالية المستوى تتيح لك تنفيذ IMS بعدة طرق، استنادًا إلى الأجهزة المتاحة. على سبيل المثال، يتغيّر التنفيذ حسب ما إذا كان تنفيذ IMS يتم بالكامل على معالج التطبيق أو إذا تم نقله جزئيًا أو كليًا إلى المودم. لا يقدّم نظام التشغيل Android واجهة HAL علنية لنقل البيانات إلى معالج النطاق الأساسي، لذا يجب أن يتم نقل أي بيانات باستخدام إضافة HAL إلى المودم.

التوافق مع عمليات تنفيذ IMS القديمة

على الرغم من أنّ نظام التشغيل Android 9 يتضمّن واجهة برمجة التطبيقات ImsService API، لا يمكن للأجهزة التي تستخدم إصدارًا قديمًا من IMS استخدام واجهة برمجة التطبيقات. بالنسبة إلى هذه الأجهزة، تم نقل واجهات AIDL وفئاتها المُغلفة القديمة إلى مساحة الاسم android.telephony.ims.compat. عند الترقية إلى Android 9، يجب أن تتّخذ الأجهزة القديمة الخطوات التالية لمواصلة إتاحة واجهة برمجة التطبيقات القديمة.

  • تغيير مساحة الاسم لتنفيذ ImsService لتوسيع نطاقها من واجهة برمجة التطبيقات لمساحة الاسم android.telephony.ims.compat
  • عدِّل تعريف خدمة ImsService في ملف AndroidManifest.xml لاستخدام إجراء android.telephony.ims.compat.ImsService intent-filter بدلاً من الإجراء android.telephony.ims.ImsService.

سيتم بعد ذلك ربط إطار العمل بخدمة ImsService باستخدام طبقة التوافق المقدَّمة في Android 9 للعمل مع التنفيذ ImsService القديم.

تسجيل ImsService باستخدام الإطار العمل

يتم تنفيذ واجهة برمجة التطبيقات ImsService كخدمة يتم ربط إطار عمل Android بها للتواصل مع تنفيذ IMS. هناك ثلاث خطوات ضرورية لتسجيل تطبيق ينفذ ImsService باستخدام الإطار. أولاً، يجب أن يسجِّل تنفيذ ImsService نفسه في ال منصّة باستخدام AndroidManifest.xml للتطبيق. ثانيًا، يجب أن يحدد ميزات IMS التي يتيح تنفيذها (MmTel أو RCS). ثالثًا، يجب التحقّق من أنّه تنفيذ IMS موثوق به إما في إعدادات مشغّل شبكة الجوّال أو في تراكب الجهاز.

تعريف الخدمة

يسجِّل تطبيق IMS سمة ImsService باستخدام إطار العمل من خلال إضافة إدخال service إلى البيان باستخدام التنسيق التالي:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

يحدد تعريف service في AndroidManifest.xml السمات التالية التي تعد ضرورية للتشغيل الصحيح:

  • directBootAware="true": يسمح باكتشاف الخدمة وتشغيلها من قِبل telephony قبل أن يفتح المستخدم قفل الجهاز. لا يمكن للخدمة الوصول إلى مساحة التخزين المشفَّرة على الجهاز قبل أن يفتح المستخدم قفل الجهاز. لمزيد من المعلومات، يُرجى الاطّلاع على إتاحة وضع "التشغيل المباشر" والتشفير المستند إلى الملفات.
  • persistent="true": يسمح بتشغيل هذه الخدمة باستمرار وعدم إيقافها من قِبل النظام لاسترداد الذاكرة. لا تعمل هذه السمة إلا إذا كان التطبيق مصمّمًا كتطبيق نظام.
  • permission="android.permission.BIND_IMS_SERVICE": يضمن هذا الإذن أنّه لا يمكن سوى ل عملية تم منحها الإذن BIND_IMS_SERVICE أن ترتبط بالتطبيق. ويمنع ذلك أي تطبيق ضار من الارتباط بالخدمة، لأنّه لا يمكن منح الإذن إلا لتطبيقات النظام من خلال إطار العمل.

يجب أن تحدّد الخدمة أيضًا عنصر intent-filter باستخدام الإجراء android.telephony.ims.ImsService. يتيح ذلك للإطار العثور على ImsService.

مواصفات ميزات IMS

بعد تحديد ImsService كخدمة Android فيملف AndroidManifest.xml، يجب أن تحدِّد ImsService ميزات IMS التي تتوافق معها. يتيح Android حاليًا ميزات MmTel وRCS، ولكن لا يتم دمج سوى MmTel في إطار العمل. على الرغم من عدم دمج واجهات برمجة تطبيقات RCS في الإطار، لا تزال هناك مزايا لإعلانها كميزة في ImsService.

في ما يلي الميزات الصالحة المحدّدة في android.telephony.ims.ImsFeature التي يمكن أن يوفّرها ImsService وشرح ومثال على سبب رغبة تطبيق IMS في تنفيذ ميزة واحدة أو كل هذه الميزات. بعد تحديد كل ميزة، توضّح هذه الصفحة الطريقة التي يحدّد بها ImsService مجموعة الميزات التي تحدّدها لكل فتحة لشريحة SIM.

FEATURE_MMTEL

ينفِّذ ImsService ميزة IMS MMTEL التي تتوافق مع جميع وسائط IMS (مواصفات IR.92 وIR.94) باستثناء الإرفاق الطارئ إلى رقم PDN لنظام IMS لمكالمات الطوارئ. أيّ عملية تنفيذ لـ ImsService تريد إتاحة ميزات MMTEL يجب أن تُوسّع الفئة الأساسية android.telephony.ims.MmTelFeature وتُعرِض عملية تنفيذ مخصّصة MmTelFeature في ImsService#createMmTelFeature.

FEATURE_EMERGENCY_MMTEL

لا يؤدي تحديد هذه الميزة إلا إلى إرسال إشارة إلى المنصة بأنّه يمكن ربط الطوارئ بشبكة PDN في IMS لخدمات الطوارئ. في حال عدم الإفصاح عن هذه الميزة لتطبيق ImsService، سيستخدم النظام الأساسي دائمًا ميزة "الرجوع إلى شبكة الجوَّال" لخدمات الطوارئ. يجب تحديد ميزة FEATURE_MMTEL لتحديد هذه الميزة.

FEATURE_RCS

لا تُنفِّذ واجهة برمجة التطبيقات ImsService API أيًا من ميزات IMS RCS، ولكن يمكن أن تظل فئة android.telephony.ims.RcsFeature الأساسية مفيدة. يرتبط إطار العمل تلقائيًا بخدمة ImsService ويطلب الرقم ImsService#createRcsFeature عند رصد أنّ الحزمة يجب أن توفّر خدمات الاتصالات التفاعلية (RCS). في حال إزالة شريحة SIM المرتبطة بخدمة RCS، يُطلِق إطار العمل تلقائيًا RcsFeature#onFeatureRemoved ثم يزيل ImsService المرتبط بميزة RCS. يمكن أن تزيل هذه الوظيفة بعض منطق الربط أو الكشف المخصّص الذي كان من المفترض أن تقدّمه ميزة RCS.

تسجيل الميزات المتوافقة

يرتبط إطار عمل خدمات الهاتف أولاً بخدمة ImsService لطلب الميزات التي يتوافق معها باستخدام واجهة برمجة التطبيقات ImsService#querySupportedImsFeatures. بعد أن يحسب الإطار المرجعي الميزات التي ستوفّرها ImsService، سيستدعي ImsService#create[...]Feature لكل ميزة ستكون ImsService مسؤولة عنها. إذا تغيّرت الميزات التي يتيح تطبيق IMS استخدامها، يمكنك استخدام ImsService#onUpdateSupportedImsFeatures للإشارة إلى إطار العمل بهدف إعادة احتساب الميزات المتوافقة. اطّلِع على المخطّط البياني التالي للحصول على مزيد من المعلومات عن بدء تشغيل ImsService وربطه.

بدء ImsService وربطه

الشكل 2: إعداد ImsService وربطه

رصد إطار العمل والتحقّق من تنفيذ ImsService

بعد تحديد ImsService بشكل صحيح في ملف AndroidManifest.xml، يجب ضبط النظام الأساسي للربط (بأمان) بخدمة ImsService عند الضرورة. هناك نوعان من خدمات ImsServices التي يرتبط بها إطار العمل:

  1. "إلغاء" مشغّل شبكة الجوّال للخدمة ImsService: يتم تحميل خدمات ImsService هذه مسبقًا على الجهاز، ولكن يتم ربطها بمشغّل شبكة جوّال واحد أو أكثر ولن يتم ربطها إلا عند إدخال شريحة SIM مطابقة. يتم ضبط ذلك باستخدام
  2. ImsService "التلقائية" للجهاز: هذه هي ImsService التلقائية التي يحمّلها المصنّع الأصلي للجهاز ويُفترض أن تكون مصمّمة لتقديم خدمات IMS في كل الحالات التي لا تتوفّر فيها ImsService لمشغّل شبكة الجوّال، وهي مفيدة في الحالات التي لا يتم فيها إدخال شريحة SIM في الجهاز أو عندما لا يتم تثبيت ImsService لمشغّل شبكة الجوّال على شريحة SIM التي تم إدخالها. يتم تحديد ذلك في المحتوى المركّب على الأجهزة باستخدام الإعدادات التالية:

لا يتيح نظام التشغيل Android استخدام التطبيقات التي تتضمّن تطبيقات تابعة لجهات خارجية قابلة للتنزيل من ImsService، لذا يجب أن تكون أي تطبيقات ImsService محدّدة هنا من تطبيقات النظام ويجب أن تكون مضمّنة في مجلد ‎ /system/priv-app/ أو ‎/product/priv-app/ لمنح الأذونات المناسبة (أي أذونات الهاتف والميكروفون والموقع الجغرافي والكاميرا وجهات الاتصال). من خلال التحقّق مما إذا كان اسم الحزمة لتطبيق IMS يتطابق مع قيم CarrierConfig أو قيم التراكب الخاصة بالجهاز المُحدّدة أعلاه، يتم ربط التطبيقات الموثوق بها والمُثبَّتة مسبقًا فقط.

التخصيص

لا تكون التطبيقات التي تنفِّذ فئة ImsService مرتبطة إلا بالأجهزة التي يتم فيها ضبطها على أنّها "إعدادات تلقائية" للخدمة ImsService أو "إعدادات تلقائية" للخدمة ImsService على الجهاز، وذلك من أجل تفعيل وظائف MMTEL أو RCS. يسمح ImsService أيضًا بفعالية ميزات IMS المتوافقة معه (MMTEL وRCS) أو إيقافها ديناميكيًا باستخدام التحديثات باستخدام الطريقة ImsService#onUpdateSupportedImsFeatures. يؤدي ذلك إلى بدء إطار العمل في إعادة احتساب خدمات ImsServices المرتبطة والميزات التي توفّرها. إذا عدّل تطبيق IMS إطار العمل بدون ميزات متوافقة، سيتم إلغاء ربط ImsService إلى أن تتم إعادة تشغيل الهاتف أو إدخال شريحة SIM جديدة تتوافق مع تطبيق IMS.

أولوية الربط لخدمة ImsService المتعددة

لا يمكن للإطار الأساسي ربط جميع خدمات ImsServices المحتملة التي يتم تحميلها مسبقًا على الجهاز، وسيتم ربط ما يصل إلى خدمتَي ImsService لكل فتحة شريحة SIM (خدمة ImsService واحدة لكل ميزة) بالترتيب التالي لكل ميزة:

  1. تشير هذه السمة إلى اسم حزمة ImsService التي تحدّدها قيمة CarrierConfig config_ims_[mmtel/rcs]_package_override_string في حال إدراج شريحة SIM.
  2. اسم حزمة ImsService المحدَّد في قيمة تراكب الجهاز لملف APK‏ config_ims_[mmtel/rcs]_package، بما في ذلك الحالة التي لا تكون فيها شريحة SIM مُدخَلة يجب أن تتوافق خدمة ImsService مع ميزة MmTel في حالات الطوارئ.

يجب أن يكون اسم حزمة ImsService محدّدًا في ملف CarrierConfig لكل مشغل شبكة جوّال سيستخدم هذه الحزمة أو في ملف تداخل الجهاز إذا كانت ImsService هي الخدمة التلقائية، كما هو محدّد أعلاه.

لنلقِ نظرة على كل ميزة على حدة. بالنسبة إلى الجهاز (شريحة SIM واحدة أو متعددة) الذي تم تحميل شريحة SIM واحدة فيه، يمكن استخدام ميزتَين من ميزات IMS: MMTel وRCS. سيحاول إطار العمل الربط بالترتيب المحدّد أعلاه لكل ميزة، وإذا لم تكن الميزة متاحة لخدمة ImsService المحدّدة في التبديل لإعدادات مشغّل شبكة الجوّال، سيستعين إطار العمل بخدمة ImsService التلقائية. على سبيل المثال، يوضّح الجدول التالي ميزة IMS التي سيستخدمها الإطار المرجعي، مع العلم أنّه تم توفير ثلاثة تطبيقات IMS تُنفِّذ ImsServices على نظام يمتاز بالميزات التالية:

  • يتوافق مشغّل شبكة الجوّال A ImsService مع خدمات الاتصالات التفاعلية (RCS).
  • يتوافق ImsService لمشغّل شبكة الجوّال (ب) مع خدمات RCS وMMTel.
  • توفُّر خدمة ImsService من المصنّع الأصلي للجهاز لخدمات RCS وMMTel
تم إدخال شريحة SIM ميزة RCS ميزة MMTel
مشغّل شبكة الجوّال (أ) مشغّل شبكة الجوّال (أ) المصنّع الأصلي للجهاز
مشغّل شبكة الجوّال (ب) شركة النقل "ب" مشغّل شبكة الجوّال (ب)
لا تتوفر شريحة SIM. المصنّع الأصلي للجهاز المصنّع الأصلي للجهاز

التحقُّق

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

تطوير تطبيق IMS

عند تطوير تطبيق IMS يتعامل مع حِزمة خدمات الهاتف في Android، ننصح بتحديد أنّه يمكن للتطبيق الاستماع إلى حالة مثيل ImsService المُرفق لاشتراك مشغّل شبكة الجوّال المحدّد أو تعديلها.

للاستماع إلى حالة ImsService أو تعديلها لميزتَي MMTEL وRCS، استخدِم الفئة ImsManager للحصول على مثيل للفئة ImsMmTelManager أو ImsRcsManager أو ProvisioningManager المخصّصة لبروتوكول IMS. يمكن للتطبيق بعد ذلك الاستماع إلى حالات الخدمة وإعداد IMS الخاصة، مثل:

  • ميزات MMTEL أو RCS المفعَّلة والمتوفّرة
  • يتم تعديلها عند تغيير حالة تسجيل IMS
  • حالة توفير المتطلبات اللازمة لميزات IMS
  • ميزات IMS التي فعّلها المستخدم

استخدام ImsStateCallback

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

على الأجهزة التي تعمل بنظام التشغيل Android 13 أو إصدار أحدث، يمكن للتطبيق استخدام فئة ImsStateCallback لرصد ما إذا كانت مثيل ImsService للاشتراك المرتبط متاحًا أو غير متاح. عند الحصول على مثال ImsMmTelManager أو ImsRcsManager، ننصح بأن يسجّل التطبيق أولاً لمعاودة الاتصال بحالة IMS باستخدام ImsMmTelManager#registerImsStateCallback أو ImsRcsManager#registerImsStateCallback. لمواصلة تلقّي إشعارات بشأن عمليات تسجيل المكالمات لاشتراكات معيّنة عندما يصبح ImsMmTelManagerImsService متاحًا مرة أخرى، يجب أن يُلغي التطبيق تسجيل عمليات تسجيل المكالمات الحالية المسجَّلة من خلال ImsMmTelManager أو ImsRcsManager أو ProvisioningManager أو يتخلّص منها، وأن يسجّل عمليات تسجيل مكالمات جديدة.

إذا كان هناك اشتراك لا يتيح استخدام IMS، يُجري إطار العمل مكالمة إلى ImsStateCallback#onUnavailable بالسبب التالي: REASON_NO_IMS_SERVICE_CONFIGURED. وهذا يعني أنّ ImsService وواجهات برمجة التطبيقات المتعلقة بخدمة IMS غير متاحة للاشتراك.

في حال تعطُّل عملية الاتصال الهاتفي، يتلقّى التطبيق ImsStateCallback#onError ويتوقف عن تلقّي آخر المعلومات حول مثيل ImsStateCallback المسجَّل. لحلّ هذه المشكلة، عليك إعادة تسجيل مثيل ImsStateCallback ل الاشتراك المرتبط من خلال الاتصال بأحد الرقمَين التاليَين: ImsMmTelManager#registerImsStateCallback أو ImsRcsManager#registerImsStateCallback.