اندروید ۹ رابطهای برنامهنویسی کاربردی (API) را برای پشتیبانی بهتر از برنامههای تماس شخص ثالث ارائه میدهد. برنامههای تماس شخص ثالث معمولاً برای همزیستی در کنار تماسهای تلفنی اپراتور، به APIهای تلفنی مانند PHONE_STATE متکی هستند. در نتیجه، برنامههای تماس شخص ثالث باید به تماسهای اپراتور اولویت دهند و اغلب به رد بیسروصدای تماسهای ورودی در برنامه یا خاتمه دادن به یک تماس در حال انجام برای ایجاد راه برای تماس اپراتور متوسل میشوند.
رابطهای برنامهنویسی کاربردی (API) در اندروید ۹ از سناریوهای تماس همزمان بین برنامههای شخص ثالث و تماسهای اپراتور پشتیبانی میکنند. این امر، به عنوان مثال، امکان دریافت تماس ورودی شخص ثالث را در حین تماس با اپراتور فراهم میکند. این چارچوب مسئولیت اطمینان از برقراری تماس اپراتور را هنگام تماس کاربر با شخص ثالث بر عهده میگیرد.
در اندروید ۹، برنامههای تماس شخص ثالث تشویق میشوند که API ConnectionService خودمدیریتشده را پیادهسازی کنند. برای اطلاعات بیشتر در مورد نحوه ساخت یک برنامه تماس با استفاده از این API، به بخش «ساخت یک برنامه تماس» مراجعه کنید.
API خودمدیریتشده 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 برگردانده شده، نام برنامه مرتبط با یک ورودی گزارش تماس از برنامه تماس گیرنده شخص ثالث را برمیگرداند.
اعتبارسنجی
برای آزمایش اینکه دستگاه شما از برنامههای تماس شخص ثالث پشتیبانی میکند، از برنامه آزمایشی Telecomm استفاده کنید که API ConnectionService خودمدیریتشده را پیادهسازی میکند. این برنامه در /packages/services/Telecomm/testapps/ قرار دارد.
برنامه آزمایشی را از ریشه مخزن منبع اندروید خود با استفاده از موارد زیر بسازید:
mmma packages/services/Telecomm/testapps/فایل apk ساخته شده را با استفاده از
adb install -g -r <apk path>نصب کنید. سپس یک آیکون نمونه خودمدیریتشده به لانچر شما اضافه میشود.برای باز کردن برنامه آزمایشی، روی نماد ضربه بزنید.
مدیریت تماسهای ورودی که باعث قطع تماس جاری میشوند
برای تأیید اینکه تماس ورودی، تماس شخص ثالث جاری را قطع میکند، این مراحل را دنبال کنید.

شکل 3. برنامه آزمایشی با پیادهسازیهای نمونه از API ConnectionService.
- گزینه Holdable را پاک کنید.
- برای شروع یک نمونه تماس خروجی جدید، روی OUTGOING ضربه بزنید.
- برای فعال کردن تماس، روی دکمه ACTIVE ضربه بزنید.
- با شماره تلفن دستگاه تحت آزمایش از طریق یک تلفن دیگر تماس بگیرید. این سناریویی را فراخوانی میکند که در آن شمارهگیر شما با نام یک برنامه ارائه میشود و تماس آن قطع خواهد شد.
- وقتی کارتان تمام شد، روی دکمهی DISCONNECT در برنامهی آزمایشی ضربه بزنید.
ورودیهای گزارش تماس از برنامههای تماس شخص ثالث
پس از انجام مراحل بالا، برنامه آزمایشی باید یک تماس را در گزارش تماس سیستم ثبت کرده باشد. برای تأیید اینکه دستگاه تماسهای دریافتی از برنامههای تماس شخص ثالث را ثبت میکند، برنامه شمارهگیر خود را باز کنید و تأیید کنید که تماس در گزارش تماس سیستم نمایش داده میشود.