پیاده سازی IMS

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

مرور کلی ImService

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

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

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

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

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

پیاده‌سازی

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

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

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

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

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

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

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

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

ویژگی_MMTEL

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

ویژگی_اضطراری_MMTEL

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

ویژگی‌ها

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

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

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

مقداردهی اولیه و اتصال ImService

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

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

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

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

اندروید از برنامه‌هایی که پیاده‌سازی‌های ImsService قابل دانلود از طرف شخص ثالث دارند پشتیبانی نمی‌کند، بنابراین هرگونه پیاده‌سازی ImsService که در اینجا تعریف شده باشد، باید برنامه‌های سیستمی باشند و باید در پوشه /system/priv-app/ یا /product/priv-app/ قرار گیرند تا مجوزهای مناسب (یعنی مجوزهای تلفن، میکروفون، مکان، دوربین و مخاطبین) را اعطا کنند. با تأیید اینکه آیا نام بسته پیاده‌سازی IMS با مقادیر CarrierConfig یا device overlay تعریف شده در بالا مطابقت دارد یا خیر، فقط برنامه‌های از پیش نصب شده و قابل اعتماد متصل می‌شوند.

سفارشی‌سازی

برنامه‌هایی که ImsService را پیاده‌سازی می‌کنند، فقط به دستگاه‌هایی متصل می‌شوند که در آن‌ها به عنوان ImsService "override" اپراتور یا تنظیمات ImsService "default" دستگاه برای عملکرد MMTEL یا RCS پیکربندی شده‌اند. ImsService همچنین به ویژگی‌های IMS که از آن‌ها پشتیبانی می‌کند (MMTEL و RCS) اجازه می‌دهد تا به صورت پویا با استفاده از به‌روزرسانی‌ها با استفاده از روش ImsService#onUpdateSupportedImsFeatures فعال یا غیرفعال شوند. این باعث می‌شود که چارچوب، ImsServiceهایی را که متصل هستند و از کدام ویژگی‌های پشتیبانی می‌کنند، دوباره محاسبه کند. اگر برنامه IMS چارچوب را بدون هیچ ویژگی پشتیبانی‌شده‌ای به‌روزرسانی کند، ImsService تا زمانی که تلفن دوباره راه‌اندازی نشود یا سیم‌کارت جدیدی که با برنامه IMS مطابقت دارد، وارد نشود، متصل نخواهد بود.

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

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

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

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

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

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

اعتبارسنجی

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

توسعه یک اپلیکیشن IMS

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

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

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

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

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

در دستگاه‌هایی که اندروید ۱۳ یا بالاتر دارند، برای نظارت بر اینکه آیا نمونه 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 ثبت‌شده دریافت نمی‌کند. برای بازیابی از این وضعیت، نمونه ImsStateCallback را برای اشتراک مرتبط با آن، با فراخوانی ImsMmTelManager#registerImsStateCallback یا ImsRcsManager#registerImsStateCallback دوباره ثبت کنید.