پیکربندی حامل

اندروید ۶.۰ و بالاتر شامل قابلیتی برای برنامه‌های دارای امتیاز ویژه است تا پیکربندی مختص اپراتور را به پلتفرم ارائه دهند. این قابلیت، که بر اساس UICC Carrier Privileges معرفی شده در اندروید ۵.۱ (Lollipop MR1) است، امکان انتقال پیکربندی اپراتور از لایه‌های پیکربندی استاتیک را فراهم می‌کند و به اپراتورها و تولیدکنندگان اصلی تجهیزات (OEM) این امکان را می‌دهد که پیکربندی اپراتور را به صورت پویا از طریق یک رابط تعریف شده به پلتفرم ارائه دهند.

یک برنامه‌ی اپراتور که به درستی امضا شده باشد، می‌تواند از قبل در تصویر سیستم بارگذاری شود، به صورت خودکار نصب شود یا به صورت دستی از طریق یک فروشگاه برنامه نصب شود. پلتفرم از برنامه درخواست می‌کند تا پیکربندی‌هایی را برای تنظیماتی از جمله موارد زیر ارائه دهد:

  • شبکه‌های رومینگ/غیر رومینگ
  • پیام صوتی تصویری
  • تنظیمات شبکه پیامک/MMS
  • پیکربندی‌های VoLTE/IMS

تعیین اینکه چه مقادیری باید برگردانده شوند، کاملاً به برنامه‌ی اپراتور بستگی دارد و می‌تواند بر اساس اطلاعات دقیقی که از طریق پلتفرم به برنامه منتقل می‌شود، پویا باشد.

مزایای کلیدی این رویکرد عبارتند از:

  • پیکربندی پویا - پشتیبانی از مفاهیمی مانند پیکربندی مشتق‌شده از غیر MCCMNC، به عنوان مثال، اپراتورهای شبکه مجازی تلفن همراه (MVNO) یا انتخاب مشتری برای خدمات اضافی.
  • پشتیبانی از دستگاه‌های فروخته شده از طریق هر کانالی - به عنوان مثال، یک تلفن همراه در بازار آزاد می‌تواند با دانلود یک برنامه از فروشگاه برنامه، به طور خودکار با تنظیمات مناسب پیکربندی شود.
  • امنیت - امتیاز ارائه این پیکربندی فقط به برنامه‌هایی داده می‌شود که توسط اپراتور امضا شده باشند.
  • API تعریف‌شده - پیش از این، این پیکربندی عمدتاً در لایه‌های XML داخلی در چارچوب ذخیره می‌شد و نه از طریق یک API عمومی. API پیکربندی حامل در اندروید ۶.۰ عمومی و به خوبی تعریف‌شده است.

چگونه کار می‌کند؟

پیکربندی را بارگیری کنید

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

مجموعه مقادیر برای یک دستگاه خاص با پرس و جو از اجزای زیر به ترتیب تعیین می‌شود:

  1. برنامه اپراتور (این قسمت اختیاری است، اما مکان پیشنهادی برای پیکربندی‌های اضافی فراتر از آنچه در پروژه متن‌باز اندروید (AOSP) وجود دارد، می‌باشد)
  2. برنامه پیکربندی پلتفرم همراه با تصویر سیستم
  3. مقادیر پیش‌فرض، که در چارچوب کدنویسی شده‌اند (معادل رفتار قبل از اندروید ۶.۰)

برنامه پیکربندی پلتفرم

یک برنامه پیکربندی پلتفرم عمومی همراه با تصویر سیستم ارائه می‌شود. این برنامه می‌تواند مقادیری را برای هر متغیری که برنامه اپراتور معمولی ارائه نمی‌دهد، ارائه دهد. برنامه پیکربندی پلتفرم را می‌توانید (در اندروید 6.0) در مسیر packages/apps/CarrierConfig پیدا کنید.

هدف این برنامه ارائه برخی پیکربندی‌های خاص برای هر شبکه در زمانی است که یک برنامه اپراتور نصب نشده باشد، و اپراتورها/سازندگان اصلی تجهیزات (OEM) باید تنها تغییرات جزئی را در ایمیج‌های خود اعمال کنند. در عوض، اپراتورها باید برنامه اپراتور جداگانه‌ای را برای سفارشی‌سازی اپراتور ارائه دهند و امکان توزیع به‌روزرسانی‌ها از طریق راه‌هایی مانند فروشگاه‌های اپلیکیشن را فراهم کنند.

چگونه امتیاز به یک برنامه اپراتور داده می‌شود

برنامه اپراتور مورد نظر باید با همان گواهی موجود در سیم کارت، همانطور که در UICC Carrier Privileges مستند شده است، امضا شود.

چه اطلاعاتی به برنامه اپراتور منتقل می‌شود

مقادیر زیر به برنامه‌ی حامل ارائه شده است که آن را قادر می‌سازد تا در مورد اینکه چه مقادیری را برگرداند، تصمیم‌گیری پویا انجام دهد:

  • ام سی سی
  • شرکت چند ملیتی
  • اس پی ان
  • آی ام اس آی
  • GID1
  • GID2
  • شناسه اپراتور

برای اطلاعات بیشتر در مورد ادغام شناسه‌های اپراتور، به ادغام شناسه‌های اپراتور با CarrierConfig مراجعه کنید.

هنگام بارگیری پیکربندی حامل رخ می‌دهد

ساخت لیست جفت‌های کلید-مقدار به صورت زیر انجام می‌شود:

  • وقتی سیم‌کارت بارگذاری می‌شود (بوت یا تعویض فوری سیم‌کارت)
  • وقتی برنامه اپراتور به صورت دستی بارگیری مجدد را آغاز می‌کند
  • وقتی برنامه اپراتور به‌روزرسانی می‌شود

برای جزئیات بیشتر به مرجع android.service.carrier.CarrierService#onLoadConfig() مراجعه کنید.

از پیکربندی استفاده کنید

وقتی پیکربندی ساخته می‌شود، مقادیر موجود در آن برای تنظیم مقادیر مختلف پیکربندی سیستم استفاده می‌شوند، از جمله:

  • تنظیمات تلفنی چارچوب داخلی
  • مقادیر پیکربندی برگردانده شده توسط SDK، برای مثال، در SmsManager
  • تنظیمات برنامه مانند مقادیر اتصال VVM در شماره‌گیر

کلیدهای پیکربندی

فهرست کلیدها به عنوان بخشی از SDK عمومی در android.telephony.CarrierConfigManager تعریف شده است و نمی‌تواند در همان سطح API تغییر کند. برای خلاصه‌ای از کلیدها به جدول زیر مراجعه کنید.

ساخت اپلیکیشن

برنامه را ایجاد کنید

برنامه شما باید سطح API اندروید 6.0 (23) را هدف قرار دهد.

کلاسی تعریف کنید که android.service.carrier.CarrierService را لغو کند.

  1. onLoadConfig برای برگرداندن مقادیری که می‌خواهید بر اساس شیء service.carrier.CarrierIdentifier ارسالی ارائه دهید، بازنویسی کنید.
  2. در سناریوهایی که پیکربندی حامل ممکن است به مرور زمان تغییر کند (مثلاً وقتی کاربر سرویس‌های اضافی به حساب خود اضافه می‌کند)، منطقی برای فراخوانی 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 مراجعه کنید.

برنامه را تست کنید

وقتی برنامه پیکربندی خود را ساختید، می‌توانید کد خود را با موارد زیر آزمایش کنید:

  • سیم‌کارتی حاوی امضای گواهی معتبر
  • دستگاهی که اندروید ۶.۰ و بالاتر را اجرا می‌کند، مثلاً یک دستگاه اندرویدی

تنظیم قابلیت‌های سرویس اپراتور

در اندروید، قابلیت‌های سرویس اپراتور مشخص می‌کند که آیا سرویس‌های صوتی، پیام‌رسانی و داده در یک دستگاه پشتیبانی می‌شوند یا خیر. اپراتورها می‌توانند قابلیت‌های سرویس اپراتور را برای یک دستگاه در سطح دستگاه و در سطح اشتراک (اندروید ۱۵ یا بالاتر) مشخص کنند.

قابلیت‌های سرویس در سطح دستگاه

قابلیت‌های سرویس سطح دستگاه هنگام تولید دستگاه پیکربندی می‌شوند (پس از تولید قابل تغییر نیستند). اپراتورها می‌توانند قابلیت‌های سطح دستگاه را از طریق لغو منابع سیستم زیر مشخص کنند:

برنامه‌ها می‌توانند از طریق APIهای زیر، قابلیت‌های سرویس سطح دستگاه را جستجو کنند:

قابلیت‌های سرویس در سطح اشتراک

برای دستگاه‌هایی که اندروید ۱۵ یا بالاتر را اجرا می‌کنند، اپراتورها می‌توانند قابلیت‌های سرویس دستگاه را در سطح اشتراک مشخص کنند. برای مشخص کردن قابلیت‌های سرویس در سطح اشتراک، از API مربوط CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY استفاده کنید. به عنوان مثال، برای مشخص کردن اینکه یک اشتراک فقط داده باشد، مقدار را روی SubscriptionManager#SERVICE_CAPABILITY_DATA تنظیم کنید.

برنامه‌ها (برنامه‌های سیستمی از پیش بارگذاری شده و برنامه‌های شخص ثالث) می‌توانند از طریق متد SubscriptionInfo.getServiceCapabilities() قابلیت‌های سرویس اپراتور را برای یک اشتراک مشخص جستجو کنند. این به توسعه‌دهندگان برنامه اجازه می‌دهد تا تجربه کاربری برنامه‌ها را بر اساس قابلیت‌های موجود برای اشتراک سفارشی کنند. به عنوان مثال، توسعه‌دهندگان برنامه می‌توانند اطمینان حاصل کنند که اگر کاربر در اشتراک فقط داده باشد، برنامه شماره‌گیر اجازه برقراری تماس را نمی‌دهد.

APIهای قابلیت‌های سرویس منسوخ‌شده

از اندروید ۱۵ به بعد، اندروید قابلیت‌های سرویس‌دهی هم در سطح دستگاه و هم در سطح اشتراک را ارائه می‌دهد. به دلیل این تغییر، APIهای قابلیت‌های سطح دستگاه موجود برای خوانایی بهتر تغییر نام دادند. جدول زیر APIهای منسوخ شده و APIهای تغییر نام یافته معرفی شده در اندروید ۱۵ را فهرست می‌کند:

منسوخ شده (اندروید ۱۴ یا پایین‌تر) معادل (اندروید ۱۵ یا بالاتر)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()