يوفر Android 9 واجهات برمجة تطبيقات لتحسين دعم تطبيقات الاتصال الخارجية. تعتمد تطبيقات الاتصال الخارجية عادةً على واجهات برمجة تطبيقات Telephony، مثل بث PHONE_STATE، للتعايش مع المكالمات الهاتفية عبر مشغّل شبكة الجوّال. نتيجةً لذلك، يجب أن تمنح تطبيقات الاتصال الخارجية الأولوية للمكالمات عبر مشغّل شبكة الجوّال، وغالبًا ما تلجأ إلى رفض المكالمات الواردة في التطبيق بدون إشعار، أو إنهاء مكالمة جارية لإفساح المجال لمكالمة عبر مشغّل شبكة الجوّال.
تتيح واجهات برمجة التطبيقات في Android 9 سيناريوهات الاتصال المتزامن بين التطبيقات الخارجية والمكالمات عبر مشغّل شبكة الجوّال. على سبيل المثال، يتيح ذلك تلقّي مكالمة خارجية واردة أثناء إجراء مكالمة عبر مشغّل شبكة الجوّال. يتحمّل الإطار مسؤولية ضمان الاحتفاظ بالمكالمة عبر مشغّل شبكة الجوّال عندما يجري المستخدم مكالمة خارجية.
في Android 9، ننصح تطبيقات الاتصال الخارجية بتنفيذ فئة ConnectionService المُدارة ذاتيًا. لمزيد من المعلومات حول كيفية إنشاء تطبيق اتصال باستخدام هذه الفئة، يُرجى الاطّلاع على مقالة إنشاء تطبيق اتصال باستخدام مكتبة Core-Telecom
library.
تمنح فئة ConnectionService المُدارة ذاتيًا أيضًا المطوّرين فرصة
الموافقة على تسجيل المكالمات في تطبيقاتهم في سجلّ المكالمات في النظام (راجِع
EXTRA_LOG_SELF_MANAGED_CALLS). وفقًا للمتطلبات الواردة في مستند تعريف التوافق مع
Android (CDD) (القسم 7.4.1.2)، عليك التأكّد من أنّ
تطبيق الاتصال أو تطبيق الهاتف يعرضان إدخالات سجلّ المكالمات هذه ويُظهران اسم
تطبيق الاتصال الخارجي الذي نشأت منه المكالمة (للاطّلاع على مثال حول كيفية استيفاء
تطبيق الاتصال في مشروع Android مفتوح المصدر (AOSP) لهذا المتطلب، راجِع إدخالات سجلّ المكالمات من تطبيقات الاتصال
الخارجية).
تكون التطبيقات مسؤولة عن ضبط CAPABILITY_SUPPORT_HOLD و
CAPABILITY_HOLD على اتصالات تطبيقاتها. ومع ذلك، من المحتمل ألا يتمكّن أحد التطبيقات من الاحتفاظ بمكالمة في بعض الظروف. يتضمّن الإطار أحكامًا لحلّ هذه الأنواع من الحالات.
السيناريوهات
عليك تعديل تطبيق الاتصال للتعامل مع السيناريوهات التالية.
التعامل مع المكالمات الواردة التي تؤدي إلى قطع مكالمة جارية
في سيناريو يتضمّن مكالمة خارجية جارية (مثل مكالمة SuperCaller) لا تتيح ميزة الاحتفاظ بالمكالمة، ويتلقّى المستخدم مكالمة على شبكة الجوّال (على سبيل المثال، باستخدام مشغّل شبكة الجوّال FooCom)، يجب أن يشير تطبيق الاتصال أو تطبيق الهاتف إلى المستخدم بأنّ الردّ على المكالمة على شبكة الجوّال سيؤدي إلى إنهاء المكالمة الخارجية الجارية.
تُعدّ تجربة المستخدم هذه مهمة لأنّه قد يكون لدى تطبيق الاتصال الخارجي مكالمة جارية لا يمكن للإطار الاحتفاظ بها. يؤدي الردّ على مكالمة جديدة على شبكة الجوّال إلى قطع المكالمة الخارجية الجارية.
يُرجى الاطّلاع على واجهة المستخدم في الشكل للحصول على مثال:
الشكل 1: مكالمة واردة تؤدي إلى قطع مكالمة خارجية جارية
يمكن لتطبيق الاتصال التحقّق مما إذا كانت المكالمة الواردة تؤدي إلى قطع مكالمة أخرى من خلال التحقّق من بيانات المكالمة الإضافية. تأكَّد من ضبط
EXTRA_ANSWERING_DROPS_FG_CALL على TRUE، وضبط
EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME على اسم التطبيق
الذي يتم قطع مكالمته عند الردّ على المكالمة الواردة على شبكة الجوّال.
إدخالات سجلّ المكالمات من تطبيقات الاتصال الخارجية
يمكن لمطوّري تطبيقات الاتصال الخارجية الموافقة على تسجيل المكالمات في تطبيقاتهم
في سجلّ المكالمات في النظام (راجِع EXTRA_LOG_SELF_MANAGED_CALLS). يعني ذلك
أنّه من الممكن أن تتضمّن سجلّ المكالمات إدخالات لا تتعلّق بالمكالمات على شبكة الجوّال.
عندما يعرض تطبيق الاتصال في مشروع Android مفتوح المصدر (AOSP) إدخالات سجلّ المكالمات المرتبطة بتطبيق اتصال خارجي، يظهر اسم التطبيق الذي تم إجراء المكالمة فيه في سجلّ المكالمات، كما هو موضّح في الشكل:
الشكل 2: إدخال في سجلّ المكالمات مع اسم تطبيق الاتصال الخارجي على تطبيق الاتصال
لتحديد اسم تطبيق مرتبط بإدخال في سجلّ المكالمات، استخدِم العمودَين
PHONE_ACCOUNT_COMPONENT_NAME و PHONE_ACCOUNT_ID في موفِّر سجلّ المكالمات لإنشاء مثيل من PhoneAccountHandle، الذي يحدّد مصدر إدخال في سجلّ المكالمات. استخدِم طلب البحث TelecomManager للحصول على
تفاصيل فئة PhoneAccount. لتحديد ما إذا كان إدخال في السجلّ هو
من تطبيق اتصال خارجي، تحقَّق من PhoneAccount الإمكانات لمعرفة
ما إذا تم ضبط CAPABILITY_SELF_MANAGED.
تعرض طريقة getLabel في PhoneAccount الذي تم إرجاعه اسم التطبيق المرتبط بإدخال في سجلّ المكالمات من تطبيق الاتصال الخارجي.
عناصر التحكّم في دمج سجلّ مكالمات بروتوكول الصوت على الإنترنت
اعتبارًا من Android 17 (مستوى واجهة برمجة التطبيقات 37)، يمكن لتطبيقات الاتصال عبر بروتوكول الصوت على الإنترنت الخارجية التي تتكامل مع Core-Telecom وCallsManager كتابة سجلّ المكالمات مباشرةً في سجلّ المكالمات الأصلي لنظام Android (CallLog.Calls).
لضمان الحفاظ على خصوصية المستخدمين والتحقق من صحة البيانات بشكل متّسق في جميع أنحاء منظومة Android المتكاملة، يجب أن تتيح جميع الأجهزة التي تعمل بإصدار Android 17 (مستوى واجهة برمجة التطبيقات 37) والإصدارات الأحدث والتي تعلن عن العلامة المميزة للاتصالات feature flag (android.software.telecom) وتتضمّن دور android.app.role.DIALER role عناصر التحكّم في دمج سجلّ مكالمات بروتوكول الصوت على الإنترنت على مستوى كل تطبيق وفقًا لمستند تعريف معايير التوافق Android Compatibility Definition Document (CDD).
متطلبات تنفيذ الأجهزة
يجب أن توفّر الأجهزة شاشة الإعدادات التي يمكن للمستخدم الوصول إليها (عادةً ما تكون ضمن الإعدادات > حسابات الاتصال > سجلّات المكالمات المدمجة) والتي تتيح للمستخدمين عرض ميزة دمج سجلّ المكالمات وتفعيلها أو إيقافها لتطبيقات بروتوكول الصوت على الإنترنت الخارجية الفردية.
لاستيفاء هذا المتطلب، عليك دمج الإعدادات التلقائية للنظام الأساسي:
- دمج إعدادات النظام الأساسي: تأكَّد من أنّ جهازك يتضمّن
com.android.phone.settings.PhoneAccountSettingsActivityالذي يوفّره نظام Android الأساسي بشكل تلقائي (com.android.phone). - متطلّب حلّ الغرض: يجب أن يحلّ جهازك الغرض
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) إلى شاشة إدارة النظام الأساسي التلقائية.
عندما يستدعي تطبيق أو طلب نظام أو رابط لصفحة معيّنة ما يلي، يجب أن يتم تشغيل PhoneAccountSettingsActivity بنجاح ويجب ألا يتم طرح ActivityNotFoundException:
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
التحقق من صحة البيانات
لاختبار ما إذا كان جهازك يتيح تطبيقات الاتصال الخارجية، استخدِم تطبيق اختبار Telecomm الذي ينفّذ فئة ConnectionService المُدارة ذاتيًا. يقع التطبيق
في
/packages/services/Telecomm/testapps/.
أنشِئ تطبيق الاختبار من جذر مستودع مصدر Android باستخدام:
mmma packages/services/Telecomm/testapps/ثبِّت ملف APK الذي تم إنشاؤه باستخدام
adb install -g -r <apk path>. بعد ذلك، تتم إضافة رمز "نموذج مُدار ذاتيًا" إلى مشغّل التطبيقات.انقر على الرمز لفتح تطبيق الاختبار.
التعامل مع المكالمات الواردة التي تؤدي إلى قطع مكالمة جارية
اتّبِع الخطوات التالية للتحقّق من أنّ المكالمة الواردة تؤدي إلى قطع مكالمة خارجية جارية.
الشكل 3: تطبيق الاختبار مع نماذج عمليات تنفيذ فئة ConnectionService
- ألغِ تحديد الخيار Holdable.
- انقر على OUTGOING لبدء مكالمة صادرة جديدة نموذجية.
- انقر على الزر ACTIVE لجعل المكالمة نشطة.
- اتّصِل برقم هاتف الجهاز قيد الاختبار باستخدام هاتف آخر. يؤدي ذلك إلى استدعاء السيناريو الذي يتم فيه تزويد تطبيق الاتصال باسم تطبيق سيتم قطع مكالمته.
- عند الانتهاء، انقر على الزر DISCONNECT في تطبيق الاختبار.
إدخالات سجلّ المكالمات من تطبيقات الاتصال الخارجية
بعد إكمال الخطوات أعلاه، من المفترض أن يكون تطبيق الاختبار قد سجّل مكالمة في سجلّ المكالمات في النظام. للتأكّد من أنّ الجهاز يسجّل المكالمات من تطبيقات الاتصال الخارجية، افتح تطبيق الاتصال وتأكَّد من ظهور المكالمة في سجلّ المكالمات في النظام.
عناصر التحكّم في دمج سجلّ مكالمات بروتوكول الصوت على الإنترنت
للتحقّق من الامتثال لمتطلّب الغرض من دمج سجلّ مكالمات بروتوكول الصوت على الإنترنت على Android 17 والإصدارات الأحدث، شغِّل اختبار CtsTelecomTestCases في مجموعة أدوات اختبار التوافق (CTS). يتحقّق هذا الاختبار من أنّ إرسال TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION (android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) يؤدي على الجهاز إلى حلّ مشكلة معالج نشاط تم تصديره صالح (resolveActivity check) على مستوى حدود الحزمة.