پیاده‌سازی IMS

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

نمای کلی ImsService

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

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

مثال‌ها و منبع

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

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

پیاده‌سازی

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

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

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

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

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

ثبت ImsService در چارچوب

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

FEATURE_RCS

«میانای برنامه‌سازی کاربردی ImsService» هیچ‌یک از ویژگی‌های «سرویس‌های ارتباطی غنی IMS» را پیاده‌سازی نمی‌کند، اما کلاس پایه android.telephony.ims.RcsFeature همچنان می‌تواند مفید باشد. چارچوب به‌طور خودکار به ImsService ملحق می‌شود و وقتی تشخیص می‌دهد که بسته باید RCS ارائه دهد، ImsService#createRcsFeature را فرا می‌خواند. اگر سیم‌کارت مرتبط با سرویس «سرویس‌های ارتباطی غنی» برداشته شود، چارچوب به‌طور خودکار RcsFeature#onFeatureRemoved را فراخوانی می‌کند و سپس ImsService مرتبط با ویژگی «سرویس‌های ارتباطی غنی» را پاک‌سازی می‌کند. این عملکرد می‌تواند برخی‌از منطق‌های سفارشی تشخیص یا اتصال را که درغیراین‌صورت ویژگی «سرویس‌های ارتباطی غنی» باید ارائه دهد بردارد.

ثبت ویژگی‌های پشتیبانی‌شده

چارچوب تلفنی ابتدا به ImsService متصل می‌شود تا ویژگی‌هایی را که بااستفاده از ImsService#querySupportedImsFeatures API پشتیبانی می‌کند پُرسمان کند. پس‌از اینکه چارچوب محاسبه کرد ImsService از کدام ویژگی‌ها پشتیبانی خواهد کرد، برای هر ویژگی‌ای که ImsService مسئول آن خواهد بود، ImsService#create[...]Feature را فراخوانی خواهد کرد. اگر ویژگی‌هایی که برنامه IMS پشتیبانی می‌کند تغییر کند، می‌توانید از ImsService#onUpdateSupportedImsFeatures برای علامت دادن به چارچوب برای محاسبه مجدد ویژگی‌های پشتیبانی‌شده استفاده کنید. برای اطلاعات بیشتر درباره مقداردهی اولیه و اتصال ImsService، نمودار زیر را ببینید.

ImsService درحال مقداردهی اولیه و اتصال است

شکل ۲. مقداردهی اولیه و اتصال ImsService

چارچوب تشخیص و درستی‌سنجی پیاده‌سازی ImsService

پس‌از اینکه ImsService به‌درستی در AndroidManifest.xml تعریف شد، پلاتفرم باید پیکربندی شود تا درصورت لزوم به‌طور ایمن به ImsService متصل شود. دو نوع ImsServices وجود دارد که چارچوب به آن‌ها متصل می‌شود:

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

‫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 که ImsServices را در سیستمی با ویژگی‌های زیر پیاده‌سازی می‌کنند، از کدام ویژگی IMS استفاده خواهد کرد:

  • «سرویس IMS» شرکت مخابراتی A از RCS پشتیبانی می‌کند
  • «سرویس IMS شرکت مخابراتی B» از RCS و MMTel پشتیبانی می‌کند
  • «سرویس Ims» سازنده اصلی محصول از «سرویس‌های ارتباطی غنی» و MMTel پشتیبانی می‌کند
سیم‌کارت وارد شد ویژگی «سرویس‌های ارتباطی غنی» ویژگی MMTel
شرکت مخابراتی الف شرکت مخابراتی الف سازنده اصلی محصول
شرکت مخابراتی ب شرکت مخابراتی ب شرکت مخابراتی ب
سیم‌کارتی وجود ندارد سازنده اصلی محصول سازنده اصلی محصول

اعتبارسنجی

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

توسعه برنامه IMS

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

برای گوش دادن به وضعیت ImsService برای ویژگی‌های MMTEL و RCS یا اصلاح آن، از کلاس ImsManager برای دریافت نمونه‌ای از کلاس ImsMmTelManager، ImsRcsManager، یا کلاس مختص IMS ProvisioningManager استفاده کنید. سپس برنامه می‌تواند به سرویس‌های خاص IMS و وضعیت‌های تأمین گوش دهد، ازجمله:

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

استفاده از ImsStateCallback

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

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

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

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