اندروید ۹ رابطهای برنامهنویسی کاربردی (API) را برای پشتیبانی بهتر از برنامههای تماس شخص ثالث ارائه میدهد. برنامههای تماس شخص ثالث معمولاً برای همزیستی در کنار تماسهای تلفنی اپراتور، به APIهای تلفنی مانند PHONE_STATE متکی هستند. در نتیجه، برنامههای تماس شخص ثالث باید به تماسهای اپراتور اولویت دهند و اغلب به رد بیسروصدای تماسهای ورودی در برنامه یا خاتمه دادن به یک تماس در حال انجام برای ایجاد راه برای تماس اپراتور متوسل میشوند.
رابطهای برنامهنویسی کاربردی (API) در اندروید ۹ از سناریوهای تماس همزمان بین برنامههای شخص ثالث و تماسهای اپراتور پشتیبانی میکنند. این امر، به عنوان مثال، امکان دریافت تماس ورودی شخص ثالث را در حین تماس با اپراتور فراهم میکند. این چارچوب مسئولیت اطمینان از برقراری تماس اپراتور را هنگام تماس کاربر با شخص ثالث بر عهده میگیرد.
در اندروید ۹، برنامههای تماس شخص ثالث تشویق میشوند که کلاس ConnectionService خودمدیریتشده را پیادهسازی کنند. برای اطلاعات بیشتر در مورد نحوه ساخت یک برنامه تماس با استفاده از این کلاس، به بخش «ساخت یک برنامه تماس با استفاده از کتابخانه Core-Telecom » مراجعه کنید.
کلاس ConnectionService که به صورت خودکار مدیریت میشود، به توسعهدهندگان این امکان را میدهد که تماسهای برنامه خود را در گزارش تماس سیستم ثبت کنند (به EXTRA_LOG_SELF_MANAGED_CALLS مراجعه کنید). طبق الزامات موجود در سند تعریف سازگاری اندروید (CDD) (بخش 7.4.1.2)، باید مطمئن شوید که برنامه شمارهگیر یا تلفن شما این ورودیهای گزارش تماس را نمایش میدهد و نام برنامه تماس شخص ثالثی را که تماس از آنجا آغاز شده است، نشان میدهد (برای مثالی از اینکه چگونه برنامه شمارهگیر AOSP این الزام را برآورده میکند، به ورودیهای گزارش تماس از برنامههای تماس شخص ثالث مراجعه کنید).
برنامهها مسئول تنظیم CAPABILITY_SUPPORT_HOLD و CAPABILITY_HOLD در اتصالات برنامههای خود هستند. با این حال، ممکن است که یک برنامه در برخی شرایط نتواند تماس را نگه دارد. این چارچوب شامل تمهیداتی برای حل این نوع موارد است.
سناریوها
شما باید برنامه شمارهگیر خود را برای مدیریت سناریوهای زیر تغییر دهید.
مدیریت تماسهای ورودی که باعث قطع تماس جاری میشوند
در سناریویی که یک تماس شخص ثالث در حال انجام است (مثلاً در یک تماس SuperCaller) که از انتظار پشتیبانی نمیکند، و کاربر یک تماس تلفن همراه دریافت میکند (مثلاً با استفاده از اپراتور FooCom)، برنامه شمارهگیر یا تلفن شما باید به کاربر نشان دهد که پاسخ دادن به تماس شبکه تلفن همراه، تماس شخص ثالث در حال انجام را پایان میدهد.
این تجربه کاربری مهم است زیرا یک برنامه تماس شخص ثالث ممکن است تماس مداومی داشته باشد که توسط چارچوب قابل نگهداری نباشد. پاسخ دادن به یک تماس موبایل جدید باعث قطع تماس شخص ثالث مداوم میشود.
برای مثال به رابط کاربری در شکل زیر توجه کنید:

شکل ۱. قطع تماس ورودی توسط شخص ثالث در حال انجام.
برنامه شمارهگیر شما میتواند با بررسی موارد اضافی تماس، بررسی کند که آیا یک تماس ورودی باعث قطع تماس دیگری میشود یا خیر. مطمئن شوید که EXTRA_ANSWERING_DROPS_FG_CALL روی TRUE تنظیم شده باشد و EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME روی نام برنامهای که تماس آن پس از پاسخ دادن به تماس موبایل ورودی قطع میشود، تنظیم شده باشد.
ورودیهای گزارش تماس از برنامههای تماس شخص ثالث
توسعهدهندگان برنامههای تماس شخص ثالث میتوانند انتخاب کنند که تماسهای برنامهشان در گزارش تماس سیستم ثبت شود (به EXTRA_LOG_SELF_MANAGED_CALLS مراجعه کنید). این بدان معناست که میتوان ورودیهایی در گزارش تماس داشت که مربوط به تماسهای شبکه تلفن همراه نباشند.
وقتی برنامه شمارهگیر AOSP ورودیهای گزارش تماس مربوط به یک برنامه تماس شخص ثالث را نمایش میدهد، نام برنامهای که تماس در آن انجام شده است، همانطور که در شکل نشان داده شده است، در گزارش تماس نمایش داده میشود:

شکل ۲. ورودی گزارش تماس به همراه نام برنامه تماس شخص ثالث در برنامه شمارهگیر.
برای تعیین نام یک برنامه مرتبط با یک ورودی گزارش تماس، از ستونهای PHONE_ACCOUNT_COMPONENT_NAME و PHONE_ACCOUNT_ID در ارائهدهنده گزارش تماس برای ایجاد یک نمونه از PhoneAccountHandle استفاده کنید که منبع یک ورودی گزارش تماس را شناسایی میکند. برای دریافت جزئیات کلاس PhoneAccount ، TelecomManager پرسوجو کنید. برای تعیین اینکه آیا یک ورودی گزارش تماس از یک برنامه تماس شخص ثالث است، قابلیتهای PhoneAccount را بررسی کنید تا ببینید آیا CAPABILITY_SELF_MANAGED تنظیم شده است یا خیر.
متد getLabel از PhoneAccount برگردانده شده، نام برنامه مرتبط با یک ورودی گزارش تماس از برنامه تماس گیرنده شخص ثالث را برمیگرداند.
کنترلهای ادغام گزارش تماس VoIP
از اندروید ۱۷ (سطح API ۳۷)، برنامههای تماس VoIP شخص ثالث که با Core-Telecom و CallsManager ادغام میشوند، میتوانند تاریخچه تماس خود را مستقیماً در گزارش تماس سیستم اندروید ( CallLog.Calls ) بنویسند.
برای اطمینان از حفظ حریم خصوصی کاربر و سلامت دادهها در سراسر اکوسیستم اندروید، تمام دستگاههای اندروید ۱۷ (سطح API ۳۷) و بالاتر که پرچم ویژگی مخابراتی ( android.software.telecom ) را اعلام میکنند و نقش android.app.role.DIALER را دارند، باید از کنترلهای ادغام گزارش تماس VoIP برای هر برنامه، طبق سند تعریف سازگاری اندروید (CDD) پشتیبانی کنند.
الزامات پیادهسازی دستگاه
دستگاهها باید یک صفحه تنظیمات قابل دسترسی برای کاربر (که معمولاً در مسیر تنظیمات > حسابهای تماس > گزارشهای تماس یکپارچه قرار دارد) ارائه دهند که به کاربران امکان مشاهده و تغییر ادغام گزارش تماس برای برنامههای VoIP شخص ثالث را بدهد.
برای برآورده کردن این نیاز، باید پیشفرض پلتفرم سهام را ادغام کنید:
- یکپارچهسازی تنظیمات پلتفرم: مطمئن شوید که دستگاه شما شامل
com.android.phone.settings.PhoneAccountSettingsActivityارائه شده توسط پلتفرم اندروید (com.android.phone) است. - الزام تفکیکپذیری Intent: دستگاه شما باید Intent مربوط به
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/ قرار دارد.
برنامه آزمایشی را از ریشه مخزن منبع اندروید خود با استفاده از موارد زیر بسازید:
mmma packages/services/Telecomm/testapps/فایل apk ساخته شده را با استفاده از
adb install -g -r <apk path>نصب کنید. سپس یک آیکون نمونه خودمدیریتشده به لانچر شما اضافه میشود.برای باز کردن برنامه آزمایشی، روی نماد ضربه بزنید.
مدیریت تماسهای ورودی که باعث قطع تماس جاری میشوند
برای تأیید اینکه تماس ورودی، تماس شخص ثالث جاری را قطع میکند، این مراحل را دنبال کنید.

شکل 3. برنامه آزمایشی با پیادهسازیهای نمونه از کلاس ConnectionService.
- گزینه Holdable را پاک کنید.
- برای شروع یک نمونه تماس خروجی جدید، روی OUTGOING ضربه بزنید.
- برای فعال کردن تماس، روی دکمه ACTIVE ضربه بزنید.
- با شماره تلفن دستگاه تحت آزمایش از طریق یک تلفن دیگر تماس بگیرید. این سناریویی را فراخوانی میکند که در آن شمارهگیر شما با نام یک برنامه ارائه میشود و تماس آن قطع خواهد شد.
- وقتی کارتان تمام شد، روی دکمهی DISCONNECT در برنامهی آزمایشی ضربه بزنید.
ورودیهای گزارش تماس از برنامههای تماس شخص ثالث
پس از انجام مراحل بالا، برنامه آزمایشی باید یک تماس را در گزارش تماس سیستم ثبت کرده باشد. برای تأیید اینکه دستگاه تماسهای دریافتی از برنامههای تماس شخص ثالث را ثبت میکند، برنامه شمارهگیر خود را باز کنید و تأیید کنید که تماس در گزارش تماس سیستم نمایش داده میشود.
کنترلهای ادغام گزارش تماس VoIP
برای تأیید انطباق با الزام ادغام گزارش تماس VoIP در اندروید ۱۷ و بالاتر، آزمون CtsTelecomTestCases Compatibility Test Suite (CTS) را اجرا کنید. این آزمون در سراسر مرزهای بسته تأیید میکند که ارسال TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION ( android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION ) روی دستگاه به یک کنترلکننده فعالیت معتبر صادر شده ( resolveActivity check) منجر میشود.