Android 6.0 و بالاتر شامل قابلیتی برای برنامه های ممتاز برای ارائه پیکربندی خاص شرکت مخابراتی به پلتفرم است. این عملکرد، بر اساس امتیازات حامل UICC که در اندروید 5.1 (Lollipop MR1) معرفی شده است، به پیکربندی اپراتور اجازه میدهد تا از پوششهای پیکربندی استاتیک دور شود و به حاملها و OEMها این امکان را میدهد تا به صورت پویا پیکربندی حامل را از طریق یک رابط تعریفشده به پلتفرم ارائه دهند.
یک برنامه حامل با امضای مناسب میتواند در تصویر سیستم از قبل بارگذاری شود، به طور خودکار نصب شود، یا به صورت دستی از طریق فروشگاه برنامه نصب شود. این برنامه توسط پلتفرم درخواست می شود تا تنظیماتی از جمله:
- شبکه های رومینگ/غیر رومینگ
- پست صوتی تصویری
- تنظیمات شبکه SMS/MMS
- تنظیمات VoLTE/IMS
تعیین اینکه چه مقادیری باید برگردانده شوند کاملاً به برنامه حامل بستگی دارد و می تواند بر اساس اطلاعات دقیق ارسال شده به برنامه از طریق پلت فرم پویا باشد.
مزایای کلیدی این رویکرد عبارتند از:
- پیکربندی پویا - پشتیبانی از مفاهیمی مانند پیکربندی مشتق شده از MCCMNC، به عنوان مثال، اپراتورهای شبکه مجازی تلفن همراه (MVNOs) یا مشتری برای شرکت در خدمات اضافی.
- پشتیبانی از دستگاههایی که از طریق هر کانالی فروخته میشوند - برای مثال، یک تلفن بازار باز را میتوان با دانلود یک برنامه از یک فروشگاه برنامه به طور خودکار با تنظیمات مناسب پیکربندی کرد.
- امنیت - امتیاز ارائه این پیکربندی فقط به برنامههای امضا شده توسط شرکت مخابراتی داده میشود.
- API تعریف شده - قبلاً این پیکربندی بیشتر در پوشش های XML داخلی در چارچوب ذخیره می شد و نه از طریق یک API عمومی. API پیکربندی حامل در اندروید 6.0 عمومی و به خوبی تعریف شده است.
چگونه کار می کند
تنظیمات را بارگیری کنید
پیکربندی حامل ارائه شده توسط این ویژگی مجموعه ای از جفت های کلید-مقدار است که رفتارهای مختلف مربوط به تلفن را در پلت فرم تغییر می دهد.
مجموعه مقادیر برای یک دستگاه خاص با جستجوی اجزای زیر به ترتیب تعیین می شود:
- برنامه حامل (این اختیاری است، اما مکان توصیه شده برای پیکربندی اضافی فراتر از آنچه در پروژه منبع باز Android (AOSP) وجود دارد) است.
- برنامه پیکربندی پلت فرم همراه با تصویر سیستم
- مقادیر پیشفرض، کدگذاری شده در چارچوب (معادل رفتار قبل از Android 6.0)
برنامه پیکربندی پلت فرم
یک برنامه پیکربندی پلت فرم عمومی با تصویر سیستم همراه است. این برنامه میتواند مقادیری را برای هر متغیری که برنامه حامل معمولی ندارد، ارائه کند. برنامه پیکربندی پلتفرم را می توان (در اندروید 6.0) در: packages/apps/CarrierConfig
پیدا کرد
هدف این برنامه ارائه برخی از پیکربندیها برای هر شبکه در زمانی است که یک برنامه حامل نصب نشده است، و شرکتهای مخابراتی/سازندههای OEM باید فقط حداقل تغییرات را در تصاویر خود در آن ایجاد کنند. در عوض، شرکتهای مخابراتی باید برنامه حامل جداگانه را برای سفارشیسازی شرکت مخابراتی ارائه کنند تا بهروزرسانیها از طریق راههایی مانند فروشگاههای اپلیکیشن توزیع شوند.
نحوه اعطای امتیاز به یک برنامه حامل
برنامه شرکت مخابراتی مورد نظر باید با همان گواهی موجود در سیم کارت، همانطور که در امتیازات شرکت مخابراتی UICC مستند شده است، امضا شود.
چه اطلاعاتی به برنامه حامل منتقل می شود
برنامه حامل با مقادیر زیر عرضه میشود که به آن امکان میدهد تصمیمی پویا در مورد اینکه چه مقادیری را برگرداند، بگیرد:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- شناسه حامل
برای اطلاعات بیشتر در مورد ادغام شناسه های حامل، به ادغام شناسه های حامل با CarrierConfig مراجعه کنید.
هنگام بارگیری پیکربندی حامل رخ می دهد
ایجاد لیست جفت ارزش کلیدی رخ می دهد:
- هنگامی که سیم کارت بارگیری می شود (بوت، یا تعویض سیم کارت)
- وقتی برنامه حامل به صورت دستی بارگیری مجدد را راه اندازی می کند
- وقتی برنامه حامل بهروزرسانی میشود
برای جزئیات بیشتر به مرجع android.service.carrier.CarrierService#onLoadConfig()
مراجعه کنید.
از کانفیگ استفاده کنید
هنگامی که پیکربندی ساخته می شود، از مقادیر موجود در آن برای تنظیم مقادیر مختلف پیکربندی سیستم استفاده می شود، از جمله:
- تنظیمات تلفن چارچوب داخلی
- مقادیر پیکربندی برگردانده شده توسط SDK، به عنوان مثال، در SmsManager
- تنظیمات برنامه مانند مقادیر اتصال VVM در Dialer
کلیدهای پیکربندی
فهرست کلیدها به عنوان بخشی از SDK عمومی در android.telephony.CarrierConfigManager
تعریف شده است و نمی تواند در همان سطح API تغییر کند. برای خلاصه ای از کلیدها به جدول زیر مراجعه کنید.
برنامه را بسازید
برنامه را ایجاد کنید
برنامه شما باید سطح API Android 6.0 (23) را هدف قرار دهد.
کلاسی را اعلام کنید که android.service.carrier.CarrierService را لغو می کند
- برای برگرداندن مقادیری که می خواهید بر اساس شیء ارسال شده
service.carrier.CarrierIdentifier
ارائه دهید، رویonLoadConfig
را لغو کنید. - منطق را برای تماس با
notifyConfigChangedForSubId
در سناریوهایی که ممکن است پیکربندی شرکت مخابراتی در طول زمان تغییر کند (به عنوان مثال، زمانی که کاربر سرویسهای اضافی را به حساب خود اضافه میکند) اضافه کنید.
یک نمونه در زیر آمده است:
public class SampleCarrierConfigService extends CarrierService { private static final String TAG = "SampleCarrierConfigService"; public SampleCarrierConfigService() { Log.d(TAG, "Service created"); } @Override public PersistableBundle onLoadConfig(CarrierIdentifier id) { Log.d(TAG, "Config being fetched"); PersistableBundle config = new PersistableBundle(); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6); // Check CarrierIdentifier and add more config if needed… return config; } }
برای جزئیات بیشتر، به مرجع android.service.carrier.CarrierService
مراجعه کنید.
کلاس را در مانیفست نام ببرید
یک نمونه در زیر آمده است:
<service android:name=".SampleCarrierConfigService" android:label="@string/service_name" android:permission="android.permission.BIND_CARRIER_SERVICES"> <intent-filter> <action android:name="android.service.carrier.CarrierService"/></intent-filter> </service>
برنامه را با همان گواهی روی سیم کارت امضا کنید
برای شرایط مورد نیاز، به امتیازات حامل UICC مراجعه کنید.
APN ها را با یک برنامه حامل اضافه کنید
برای افزودن APN به صورت برنامهنویسی از یک برنامه حامل (به عنوان مثال، در حین فعالسازی سیمکارت)، از APIهای ContentResolver
برای افزودن موارد APN به ارائهدهنده محتوا که توسط URI android.provider.Telephony.Carriers.CONTENT_URI
شناسایی شده است، استفاده کنید. برای اطلاعات بیشتر در مورد ساختار جدول برای URI محتوا، Telephony.Carriers
را ببینید.
برای اطلاعات بیشتر، به APN و CarrierConfig مراجعه کنید.
برنامه را تست کنید
هنگامی که برنامه پیکربندی خود را ساختید، می توانید کد خود را با موارد زیر آزمایش کنید:
- سیم کارت حاوی امضای گواهی معتبر
- دستگاهی که دارای Android نسخه 6.0 و بالاتر است، به عنوان مثال یک دستگاه Android
قابلیتهای خدمات حامل را تنظیم کنید
در Android، قابلیتهای خدمات شرکت مخابراتی توضیح میدهند که آیا خدمات صوتی، پیامرسانی و داده در دستگاه پشتیبانی میشوند یا خیر. شرکتهای مخابراتی میتوانند قابلیتهای خدمات شرکت مخابراتی را برای یک دستگاه در سطح دستگاه و در سطح اشتراک (اندروید 15 یا بالاتر) مشخص کنند.
قابلیت های سرویس در سطح دستگاه
قابلیتهای سرویس در سطح دستگاه هنگام تولید دستگاه پیکربندی میشوند (بعد از ساخت قابل تغییر نیستند). اپراتورها می توانند قابلیت های سطح دستگاه را از طریق لغو منابع سیستم زیر مشخص کنند:
برنامهها میتوانند قابلیتهای سرویس در سطح دستگاه را از طریق APIهای زیر جستجو کنند:
قابلیت های خدمات در سطح اشتراک
برای دستگاههای دارای Android 15 یا بالاتر، شرکتهای مخابراتی میتوانند قابلیتهای سرویس دستگاه را در سطح اشتراک مشخص کنند. برای تعیین قابلیتهای سرویس در سطح اشتراک، از CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
API استفاده کنید. برای مثال، برای تعیین اینکه یک اشتراک فقط داده باشد، مقدار را روی SubscriptionManager#SERVICE_CAPABILITY_DATA
تنظیم کنید.
برنامهها (برنامههای سیستمی از پیش بارگذاریشده و برنامههای شخص ثالث) میتوانند قابلیتهای سرویس حامل را برای یک اشتراک مشخص از طریق روش SubscriptionInfo.getServiceCapabilities()
پرس و جو کنند. این به توسعه دهندگان برنامه اجازه می دهد تا تجربه کاربری برنامه ها را بر اساس قابلیت های موجود برای اشتراک سفارشی کنند. به عنوان مثال، توسعه دهندگان برنامه می توانند اطمینان حاصل کنند که اگر کاربر اشتراک فقط داده باشد، برنامه شماره گیر اجازه برقراری تماس را نمی دهد.
APIهای قابلیت های سرویس منسوخ شده
با شروع اندروید 15، اندروید هم قابلیت خدمات در سطح دستگاه و هم در سطح اشتراک را ارائه می دهد. به دلیل این تغییر، APIهای موجود در سطح دستگاه برای خوانایی بهتر تغییر نام دادند. جدول زیر API های منسوخ شده و API های تغییر نام یافته معرفی شده در Android 15 را فهرست می کند:
منسوخ شده (اندروید 14 یا پایین تر) | معادل (اندروید 15 یا بالاتر) |
---|---|
TelephonyManager.isVoiceCapable() | TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() | TelephonyManager.isDeviceSmsCapable() |