پیاده سازی IMS

اندروید 9 یک رابط SystemApi به نام ImsService را معرفی می کند تا به شما در پیاده سازی زیرسیستم چند رسانه ای IP (IMS) کمک کند. ImsService API یک رابط کاملاً تعریف شده بین پلتفرم اندروید و پیاده سازی IMS توسط فروشنده یا اپراتور است.

نمای کلی ImsService

شکل 1. نمای کلی ImsService

با استفاده از رابط ImsService، پیاده‌کننده IMS می‌تواند اطلاعات سیگنالینگ مهمی را به پلتفرم ارائه دهد، مانند اطلاعات ثبت نام IMS، یکپارچه‌سازی پیامک روی IMS و یکپارچه‌سازی ویژگی MmTel برای ارائه تماس صوتی و تصویری. ImsService API نیز یک API سیستم اندروید است، به این معنی که می‌توان آن را مستقیماً به‌جای منبع، در برابر Android SDK ساخت. یک برنامه IMS که از قبل روی دستگاه نصب شده است را نیز می توان به گونه ای پیکربندی کرد که Play Store قابل به روز رسانی باشد.

مثال ها و منبع

Android برنامه ای را در AOSP ارائه می دهد که بخش هایی از ImsService API را برای اهداف آزمایش و توسعه پیاده سازی می کند. می توانید برنامه را در /testapps/ImsTestService پیدا کنید.

شما می توانید اسناد ImsService API را در ImsService و در کلاس های دیگر در API پیدا کنید.

پیاده سازی

ImsService API یک API سطح بالایی است که به شما امکان می دهد بسته به سخت افزار موجود، IMS را به طرق مختلف پیاده سازی کنید. برای مثال، پیاده‌سازی بسته به اینکه پیاده‌سازی IMS به طور کامل بر روی پردازنده برنامه باشد یا به طور جزئی یا کامل روی مودم بارگذاری شده باشد، تغییر می‌کند. Android یک HAL عمومی برای بارگیری در پردازنده باند پایه ارائه نمی‌کند، بنابراین هرگونه بارگیری باید با استفاده از پسوند HAL شما روی مودم انجام شود.

سازگاری با پیاده سازی های قدیمی IMS

اگرچه Android 9 شامل ImsService API است، دستگاه‌هایی که از یک پیاده‌سازی قدیمی‌تر برای IMS استفاده می‌کنند قادر به پشتیبانی از API نیستند. برای این دستگاه‌ها، رابط‌های قدیمی‌تر AIDL و کلاس‌های wrapper به فضای نام android.telephony.ims.compat منتقل شده‌اند. هنگام ارتقاء به Android 9، دستگاه‌های قدیمی‌تر باید برای ادامه پشتیبانی از API قدیمی‌تر، موارد زیر را انجام دهند.

  • فضای نام پیاده سازی ImsService را تغییر دهید تا از android.telephony.ims.compat فضای نام API گسترش یابد.
  • تعریف سرویس ImsService را در AndroidManifest.xml تغییر دهید تا به جای عمل android.telephony.ims.compat.ImsService از عملکرد فیلتر قصد android.telephony.ims.ImsService استفاده کنید.

سپس این چارچوب با استفاده از لایه سازگاری ارائه شده در Android 9 برای کار با پیاده سازی قدیمی ImsService به ImsService متصل می شود.

ثبت نام ImsService با فریمورک

ImsService API به عنوان یک سرویس پیاده سازی شده است که چارچوب Android به منظور ارتباط با پیاده سازی IMS به آن متصل می شود. برای ثبت برنامه ای که یک ImsService را با فریم ورک اجرا می کند، سه مرحله لازم است. ابتدا، پیاده سازی ImsService باید با استفاده از AndroidManifest.xml برنامه، خود را در پلتفرم ثبت کند. دوم، باید مشخص کند که پیاده سازی از کدام ویژگی های IMS پشتیبانی می کند (MmTel یا RCS). و سوم، باید به‌عنوان پیاده‌سازی IMS مطمئن در پیکربندی حامل یا پوشش دستگاه تأیید شود.

تعریف خدمات

برنامه IMS با افزودن یک ورودی service به مانیفست با استفاده از قالب زیر، یک ImsService را با چارچوب ثبت می‌کند:

<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 را پشتیبانی می کند. اندروید در حال حاضر از ویژگی‌های MmTel و RCS پشتیبانی می‌کند، اما فقط MmTel در چارچوب ادغام شده است. اگرچه هیچ API RCS یکپارچه در چارچوب وجود ندارد، اما هنوز مزایایی برای اعلام آن به عنوان یکی از ویژگی های ImsService وجود دارد.

در زیر ویژگی‌های معتبر تعریف شده در android.telephony.ims.ImsFeature که یک ImsService می‌تواند ارائه کند و توضیح و مثالی در مورد اینکه چرا یک برنامه IMS می‌خواهد یک یا همه این ویژگی‌ها را پیاده‌سازی کند، در زیر آمده است. پس از تعریف هر ویژگی، این صفحه نحوه اعلام مجموعه ویژگی هایی را که ImsService برای هر شکاف سیم کارت تعریف می کند، توضیح می دهد.

FEATURE_MMTEL

ImsService ویژگی IMS MMTEL را پیاده سازی می کند که شامل پشتیبانی از تمام رسانه های IMS (مشخصات IR.92 و IR.94) به جز اتصال اضطراری به IMS PDN برای تماس اضطراری است. هر پیاده سازی ImsService که بخواهد از ویژگی های MMTEL پشتیبانی کند باید کلاس پایه android.telephony.ims.MmTelFeature را گسترش دهد و یک پیاده سازی MmTelFeature سفارشی را در ImsService#createMmTelFeature برگرداند.

FEATURE_EMERGENCY_MMTEL

اعلام این ویژگی فقط به پلتفرم سیگنال می دهد که برای خدمات اضطراری به IMS PDN متصل می شود. اگر این ویژگی برای ImsService شما اعلام نشده باشد، پلتفرم همیشه به طور پیش‌فرض روی Circuit Switch Fallback برای خدمات اضطراری خواهد بود. ویژگی FEATURE_MMTEL باید تعریف شود تا این ویژگی تعریف شود.

FEATURE_RCS

ImsService API هیچ ویژگی IMS RCS را پیاده سازی نمی کند، اما کلاس پایه android.telephony.ims.RcsFeature همچنان می تواند مفید باشد. چارچوب به طور خودکار به ImsService متصل می شود و هنگامی که تشخیص می دهد که بسته باید RCS را ارائه دهد، ImsService#createRcsFeature را فراخوانی می کند. اگر سیم کارت مرتبط با سرویس 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 (به طور ایمن) متصل شود. دو نوع ImsService وجود دارد که چارچوب به آنها متصل می شود:

  1. ImsService "لغو" حامل: این ImsService ها از قبل روی دستگاه بارگذاری شده اند، اما به یک یا چند حامل تلفن همراه متصل هستند و تنها زمانی که سیم کارت منطبق وارد شده باشد، متصل می شوند. این با استفاده از پیکربندی شده است
  2. ImsService «پیش‌فرض» دستگاه: این ImsService پیش‌فرض است که توسط یک OEM بر روی دستگاه بارگذاری می‌شود و باید طوری طراحی شود که خدمات IMS را در همه شرایطی که ImsService شرکت مخابراتی در دسترس نیست ارائه دهد و در شرایطی که دستگاه سیم کارت ندارد مفید است. قرار داده شده است یا سیم کارت درج شده دارای یک شرکت مخابراتی ImsService نصب نشده است. این در پوشش دستگاه با استفاده از تنظیمات زیر تعریف شده است:

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 تا زمانی که تلفن راه‌اندازی مجدد نشود یا سیم‌کارت جدیدی وارد شود که مطابق با برنامه IMS باشد، باز می‌شود.

اولویت اتصال برای چندین ImsService

این چارچوب نمی‌تواند از اتصال به همه ImsService‌های احتمالی که از قبل روی دستگاه بارگذاری شده‌اند پشتیبانی کند و به ترتیب زیر بر اساس هر ویژگی به دو ImsService در هر اسلات سیم‌کارت (یک ImsService برای هر ویژگی) متصل می‌شود:

  1. نام بسته ImsService که توسط مقدار CarrierConfig config_ims_[mmtel/rcs]_package_override_string تعریف می‌شود وقتی سیم‌کارتی در آن قرار داده شده است.
  2. نام بسته ImsService در مقدار همپوشانی دستگاه برای config_ims_[mmtel/rcs]_package تعریف شده است، از جمله مواردی که سیم‌کارتی درج نشده است. این ImsService باید از ویژگی MmTel اضطراری پشتیبانی کند.

همانطور که در بالا تعریف شد، باید نام بسته ImsService خود را در CarrierConfig برای هر یک از حامل هایی که از آن بسته استفاده می کنند، تعریف کرده باشید یا در پوشش دستگاه، همانطور که در بالا تعریف شد، ImsService شما پیش فرض باشد.

بیایید این را برای هر ویژگی تجزیه کنیم. برای یک دستگاه (تک یا چند سیم کارت) با یک سیم کارت بارگذاری شده، دو ویژگی IMS امکان پذیر است: MMTel و RCS. چارچوب سعی می‌کند به ترتیب تعریف شده در بالا برای هر ویژگی متصل شود و اگر این ویژگی برای ImsService تعریف‌شده در لغو تنظیمات حامل در دسترس نباشد، چارچوب به ImsService پیش‌فرض شما برمی‌گردد. بنابراین، برای مثال، جدول زیر توضیح می‌دهد که چارچوب از کدام ویژگی IMS استفاده می‌کند، با توجه به سه برنامه IMS که ImsServices نصب شده بر روی یک سیستم با ویژگی‌های زیر را اجرا می‌کنند:

  • Carrier A ImsService از RCS پشتیبانی می کند
  • Carrier B ImsService از RCS و MMTel پشتیبانی می کند
  • OEM ImsService از RCS و MMTel پشتیبانی می کند
سیم کارت درج شد ویژگی RCS ویژگی MMTel
حامل A حامل A OEM
حامل B حامل B حامل B
سیم کارت نداره OEM OEM

اعتبار سنجی

ابزارهای تأیید پیاده سازی IMS شامل نمی شود زیرا مشخصات IMS بسیار بزرگ است و از تجهیزات تأیید ویژه استفاده می کند. آزمایش‌ها فقط می‌توانند تأیید کنند که چارچوب تلفن به درستی به ImsService API پاسخ می‌دهد.

یک برنامه IMS توسعه دهید

هنگام توسعه یک برنامه IMS که با پشته تلفن Android ارتباط برقرار می کند، توصیه می کنیم مشخص کنید که برنامه بتواند به نمونه ImsService که برای اشتراک شرکت مخابراتی خاصی پیوست شده است گوش دهد یا وضعیت آن را تغییر دهد.

برای گوش دادن یا تغییر وضعیت ImsService برای ویژگی‌های MMTEL و RCS، از کلاس ImsManager برای دریافت نمونه‌ای از کلاس ImsMmTelManager ، ImsRcsManager یا IMS-specific ProvisioningManager استفاده کنید. سپس این برنامه می‌تواند به وضعیت‌های ارائه خدمات و ارائه خدمات ویژه IMS مانند:

  • ویژگی های MMTEL یا RCS که فعال و در دسترس هستند
  • هنگامی که وضعیت ثبت IMS تغییر می کند، به روز می شود
  • وضعیت ارائه ویژگی های IMS
  • ویژگی های IMS که کاربر فعال کرده است

از ImsStateCallback استفاده کنید

اگرچه ImsService یک سرویس پیوسته است، اما زمانی که سیم کارت جدید یا اشتراک جاسازی شده فعال می شود یا پیکربندی شرکت مخابراتی تغییر می کند، سرویسی که محدود می شود ممکن است تغییر کند. از آنجایی که ImsService بخشی از فرآیند تلفن نیست، در صورتی که ImsService به دلیل اشتراک یا تغییر پیکربندی به طور نامرئی از کار بیفتد یا محدود شود، ممکن است یک برنامه در هنگام تلاش برای دسترسی به IMS API با استثناهای پیش بینی نشده مواجه شود.

در دستگاه‌های دارای Android نسخه 13 یا بالاتر، برای نظارت بر موجود یا در دسترس نبودن نمونه ImsService برای اشتراک مرتبط، یک برنامه می‌تواند از کلاس ImsStateCallback استفاده کند. هنگام دریافت نمونه‌ای از ImsMmTelManager یا ImsRcsManager ، توصیه می‌کنیم که برنامه ابتدا با استفاده از ImsMmTelManager#registerImsStateCallback یا ImsRcsManager#registerImsStateCallback برای یک تماس وضعیت IMS ثبت نام کند. برای ادامه دریافت به‌روزرسانی‌های پاسخ به تماس برای اشتراک‌های خاص، زمانی که ImsService دوباره در دسترس قرار گرفت، برنامه باید تماس‌های موجود ثبت‌شده از طریق ImsMmTelManager ، ImsRcsManager ، یا ProvisioningManager را لغو ثبت کند یا صرف‌نظر کند. و تماس های جدید را ثبت کنید.

اگر اشتراکی وجود دارد که از IMS پشتیبانی نمی‌کند، چارچوب ImsStateCallback#onUnavailable با دلیل REASON_NO_IMS_SERVICE_CONFIGURED فراخوانی می‌کند. این بدان معناست که ImsService و APIهای مرتبط با IMS برای اشتراک در دسترس نیستند.

در صورتی که فرآیند تلفن از کار بیفتد، برنامه ImsStateCallback#onError دریافت می‌کند و دیگر به‌روزرسانی‌های مورد ثبت‌شده ImsStateCallback را دریافت نمی‌کند. برای بازیابی از این وضعیت، با فراخوانی ImsMmTelManager#registerImsStateCallback یا ImsRcsManager#registerImsStateCallback نمونه ImsStateCallback برای اشتراک مرتبط مجدداً ثبت کنید.