اندروید 9 یک رابط SystemApi به نام ImsService را معرفی می کند تا به شما در پیاده سازی زیرسیستم چند رسانه ای IP (IMS) کمک کند. ImsService API یک رابط کاملاً تعریف شده بین پلتفرم اندروید و پیاده سازی IMS توسط فروشنده یا اپراتور است.
شکل 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 به نمودار زیر مراجعه کنید.
شکل 2: مقداردهی اولیه و اتصال ImsService
شناسایی چارچوب و تأیید اجرای ImsService
هنگامی که ImsService به درستی در AndroidManifest.xml تعریف شد، پلتفرم باید به گونه ای پیکربندی شود که در صورت لزوم به ImsService (به طور ایمن) متصل شود. دو نوع ImsService وجود دارد که چارچوب به آنها متصل می شود:
- ImsService "لغو" حامل: این ImsService ها از قبل روی دستگاه بارگذاری شده اند، اما به یک یا چند حامل تلفن همراه متصل هستند و تنها زمانی که سیم کارت منطبق وارد شده باشد، متصل می شوند. این با استفاده از پیکربندی شده است
-
config_ims_mmtel_package_override_string
کلید CarrierConfig برای ImsServices که ویژگیهای MMTEL را پیادهسازی میکند. -
config_ims_rcs_package_override_string
برای ImsServices که ویژگیهای RCS را پیادهسازی میکند.
-
- ImsService «پیشفرض» دستگاه: این ImsService پیشفرض است که توسط یک OEM بر روی دستگاه بارگذاری میشود و باید طوری طراحی شود که خدمات IMS را در همه شرایطی که ImsService شرکت مخابراتی در دسترس نیست ارائه دهد و در شرایطی که دستگاه سیم کارت ندارد مفید است. قرار داده شده است یا سیم کارت درج شده دارای یک شرکت مخابراتی ImsService نصب نشده است. این در پوشش دستگاه با استفاده از تنظیمات زیر تعریف شده است:
-
config_ims_mmtel_package
: ویژگی های MMTEL را پیاده سازی می کند -
config_ims_rcs_package
: ویژگیهای RCS را پیادهسازی میکند
-
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 برای هر ویژگی) متصل میشود:
- نام بسته ImsService که توسط مقدار CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
تعریف میشود وقتی سیمکارتی در آن قرار داده شده است. - نام بسته 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
برای اشتراک مرتبط مجدداً ثبت کنید.