eSIM uygulayın

Yerleşik SIM (eSIM veya eUICC) teknolojisi, mobil kullanıcıların şunları yapmasına olanak tanır: bir operatör profili indirin ve fiziksel SIM kart. GSMA tarafından desteklenen global bir spesifikasyondur ve herhangi bir mobil cihaz için uzaktan SIM temel hazırlığı (RSP) sağlayabilir. Android'i kullanmaya başlama 9 ile birlikte Android çerçevesi, eSIM'e erişme ve eSIM'i abonelik profillerini yönetme. Bu eUICC'ler API'ler, üçüncü tarafların kendi operatör uygulamalarını ve yerel profillerini geliştirmelerine olanak tanır. asistanlar (LPA'lar) kullanılabilir.

LPA, Android derleme görüntüsü eSIM'deki profillerin yönetimi genellikle SM-DP+ (uzaktan hizmet) ile eUICC çipini hazırlar, depolar ve cihazlara gönderir.) LPA APK'sı isteğe bağlı olarak Son kullanıcının tüm yerleşik abonelikleri yönetebileceği merkezi bir yer sağlaması profil. Android çerçevesi, en iyi uygulamaları otomatik olarak keşfedip kullanılabilir LPA'yı kullanır ve tüm eUICC işlemlerini bir LPA örneği üzerinden yönlendirir.

Basitleştirilmiş Uzaktan SIM Temel Hazırlık (RSP) mimarisi

Şekil 1. Basitleştirilmiş RSP mimarisi

Operatör uygulaması oluşturmak isteyen mobil ağ operatörleri API’lerin EuiccManager, üst düzey profil yönetimi işlemleri sağlar; örneğin, downloadSubscription(), switchToSubscription() ve deleteSubscription().

Kendi LPA sistem uygulamasını oluşturmak isteyen bir cihaz OEM'siyseniz uzat EuiccService Android çerçevesinin LPA hizmetlerinize bağlanmasını sağlayın. Ayrıca, API'leri EuiccCardManager GSMA RSP 2.0 sürümüne dayalı ES10x işlevleri sağlayan. Bu işlevler, eUICC çipine aşağıdaki gibi komutları göndermek için kullanılır: prepareDownload(), loadBoundProfilePackage(), retrieveNotificationList(), ve resetMemory().

Şuradaki API'ler: EuiccManager düzgün uygulanmış bir LPA uygulamasının çalışmasını ve çağrıyı yapan kişinin EuiccCardManager API'ler LPA olmalıdır. Bu, Android çerçevesi tarafından zorunlu kılınır.

Android 10 veya sonraki sürümleri çalıştıran cihazlar birden fazla eSIM'e sahip cihazlar. Daha fazla bilgi için bkz. Birden fazla eSIM'i destekleme.

Operatör uygulaması oluştur

Android 9'daki eUICC API'leri, mobil şebeke operatörlerini Android'de kendi işletmelerini profil oluşturabilirsiniz. Buna abonelik profillerini indirme ve silme de dahildir operatöre ait olan ve operatöre ait bir profile geçmenin yanı sıra

Kullanıcı Adı Yöneticisi

EuiccManager, uygulamaların LPA. İndirme, silme ve geçiş yapan operatör uygulamaları da buna dahildir operatöre ait aboneliklerin sayısı. LUI sistem uygulaması da dahildir. Tüm yerleşik aboneliklerin yönetilmesi için merkezi bir konum/kullanıcı arayüzü sağlar ve EuiccService sağlayan uygulamadan farklı bir uygulama olabilir.

Bir operatör uygulamasının, herkese açık API'leri kullanmak için öncelikle EuiccManager - Context#getSystemService:

EuiccManager mgr = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);

Herhangi bir işlem gerçekleştirmeden önce cihazda eSIM'in desteklenip desteklenmediğini kontrol etmeniz gerekir eSIM işlemleri. EuiccManager#isEnabled(),true android.hardware.telephony.euicc özelliği tanımlanmış ve bir LPA paketi gösterir.

if (mgr == null || !mgr.isEnabled()) {
    return;
}

eUICC donanımı ve eSIM OS sürümü hakkında bilgi almak için:

EuiccInfo info = mgr.getEuiccInfo();
String osVer = info.getOsVersion();

downloadSubscription() ve switchToSubscription() gibi birçok API Tamamlanması saniyeler, hatta dakikalar sürebileceğinden PendingIntent geri çağırma. PendingIntent, EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ alan, rastgele bir ayrıntılı sonuç kodunun yanı sıra çerçeve tanımlı hata kodları ve LPA'dan EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE olarak yayılır ve günlük kaydı/hata ayıklama amacıyla takip edilecek operatör uygulaması PendingIntent geri çağırma, BroadcastReceiver olmalıdır.

İndirilebilir belirli bir aboneliği ( etkinleştirme kodu veya QR kodu kullanabilirsiniz.

// Register receiver.
static final String ACTION_DOWNLOAD_SUBSCRIPTION = "download_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
BroadcastReceiver receiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (!action.equals(intent.getAction())) {
                    return;
                }
                resultCode = getResultCode();
                detailedCode = intent.getIntExtra(
                    EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE,
                    0 /* defaultValue*/);

                // If the result code is a resolvable error, call startResolutionActivity
                if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR) {
                    PendingIntent callbackIntent = PendingIntent.getBroadcast(
                        getContext(), 0 /* requestCode */, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
                    mgr.startResolutionActivity(
                        activity,
                        0 /* requestCode */,
                        intent,
                        callbackIntent);
                }

                resultIntent = intent;
            }
        };
context.registerReceiver(receiver,
        new IntentFilter(ACTION_DOWNLOAD_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Download subscription asynchronously.
DownloadableSubscription sub = DownloadableSubscription
        .forActivationCode(code /* encodedActivationCode*/);
Intent intent = new Intent(action).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.downloadSubscription(sub, true /* switchAfterDownload */,
        callbackIntent);

AndroidManifest.xml içindeki izni tanımlayın ve kullanın:

    <permission android:protectionLevel="signature" android:name="com.your.company.lpa.permission.BROADCAST" />
    <uses-permission android:name="com.your.company.lpa.permission.BROADCAST"/>

Belirtilen abonelik kimliğiyle bir aboneliğe geçiş yapmak için:

// Register receiver.
static final String ACTION_SWITCH_TO_SUBSCRIPTION = "switch_to_subscription";
static final String LPA_DECLARED_PERMISSION
    = "com.your.company.lpa.permission.BROADCAST";
BroadcastReceiver receiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (!action.equals(intent.getAction())) {
                    return;
                }
                resultCode = getResultCode();
                detailedCode = intent.getIntExtra(
                    EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE,
                    0 /* defaultValue*/);
                resultIntent = intent;
            }
        };
context.registerReceiver(receiver,
        new IntentFilter(ACTION_SWITCH_TO_SUBSCRIPTION),
        LPA_DECLARED_PERMISSION /* broadcastPermission*/,
        null /* handler */);

// Switch to a subscription asynchronously.
Intent intent = new Intent(action).setPackage(context.getPackageName());
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
mgr.switchToSubscription(1 /* subscriptionId */, callbackIntent);

EuiccManager API'lerinin ve kod örneklerinin tam listesi için şu sayfaya göz atın: eUICC API'leri.

Çözülebilir hatalar

Sistemin eSIM işlemini tamamlayamadığı bazı durumlar olabilir kullanıcı tarafından çözülebilir. Örneğin, downloadSubscription profil meta verileri bir operatör onay kodunun belirtildiğini gösteriyorsa başarısız olabilir gereklidir. Operatör uygulamasında operatör varsa switchToSubscription de başarısız olabilir ayrıcalıkları (yani profilin sahibi olan operatör) mevcut durumda etkinleştirilmiş profil üzerinde operatör ayrıcalıklarına sahip değil ve bu nedenle kullanıcı izni gereklidir.

Bu durumlarda, arayanın geri araması EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR Geri çağırma Intent, arayanın aktardığı dahili ekstralar içeriyor EuiccManager#startResolutionActivity, LUI üzerinden bir çözüm talep edebilirsiniz. Onay kodunu kullanarak yine bir örnek düşünelim, EuiccManager#startResolutionActivity kullanıcının onay kodu girmesine izin veren bir kullanıcı arayüzü ekranını tetikleme; Kod girildikten sonra indirme işlemi devam ettirilir. Bu yaklaşım operatör uygulamasına kullanıcı arayüzünün ne zaman gösterileceği konusunda tam kontrol sağlar LPA/LUI, kullanıcı tarafından kurtarılabilir öğelerin yeni işlenmesini eklemek için genişletilebilir bir yöntem ve sorunlarınızı daha hızlı bir şekilde anlamanızı sağlar.

Android 9, bu çözümlenebilir hataları EuiccService LUI'nin ele alması gereken:

/**
 * Alert the user that this action will result in an active SIM being
 * deactivated. To implement the LUI triggered by the system, you need to define
 * this in AndroidManifest.xml.
 */
public static final String ACTION_RESOLVE_DEACTIVATE_SIM =
        "android.service.euicc.action.RESOLVE_DEACTIVATE_SIM";
/**
 * Alert the user about a download/switch being done for an app that doesn't
 * currently have carrier privileges.
 */
public static final String ACTION_RESOLVE_NO_PRIVILEGES =
        "android.service.euicc.action.RESOLVE_NO_PRIVILEGES";

/** Ask the user to resolve all the resolvable errors. */
public static final String ACTION_RESOLVE_RESOLVABLE_ERRORS =
        "android.service.euicc.action.RESOLVE_RESOLVABLE_ERRORS";

Operatör ayrıcalıkları

EuiccManager adlı kendi operatör uygulamanızı geliştiren bir operatörseniz profilleri bir cihaza indirmek için, profiliniz operatörü içermelidir. operatör uygulamanıza karşılık gelen ayrıcalık kurallarını değiştirebilirsiniz. Bu çünkü farklı operatörlere ait abonelik profilleri bir arada eUICC'sini sağlamalı ve her operatör uygulamasının yalnızca operatöre ait profil oluşturabilirsiniz. Örneğin, A operatörü şunları yapamaz: B operatörüne ait bir profili indirme, etkinleştirme veya devre dışı bırakma.

Android, bir profile yalnızca sahibinin erişebildiğinden emin olmak için aşağıdakileri yapan bir mekanizma kullanır: profil sahibinin uygulamasına (yani operatör uygulamasına) özel ayrıcalıklar tanıyabilir. İlgili içeriği oluşturmak için kullanılan Android platformu, profilin erişim kuralı dosyasında depolanan sertifikaları yükler (ARF) sunar ve bu sertifikalarla imzalanan uygulamaların arama yapmasına izin verir EuiccManager API'ye. Genel süreç aşağıda açıklanmıştır:

  1. Operatör, operatör uygulaması APK'sını imzalar; "the" apksigner araç, ortak anahtar sertifikasını APK'ya ekler.
  2. Operatör/SM-DP+, bir profili ve ARF'yi de içeren meta verilerini hazırlar içerir:

    1. Operatör uygulamasının ortak anahtar sertifikasının imzası (SHA-1 veya SHA-256) (zorunlu)
    2. Kargo şirketinin paket adı (kesinlikle önerilir)
  3. Operatör uygulaması, EuiccManager API ile bir eUICC işlemi gerçekleştirmeye çalışıyor.

  4. Android platformu, arayan uygulamanın SHA-1 veya SHA-256 karmasını doğrular. sertifika yetkilisinden alınan sertifikanın imzasıyla hedef profilin ARF'si. Operatör uygulamasının paket adı arayan uygulamanın paket adıyla da aynı olmalıdır.

  5. İmza ve paket adı (varsa) doğrulandıktan sonra arayan uygulamasına hedef profil üzerinden operatör ayrıcalığı verildi.

Profil meta verileri profilin dışında da kullanılabileceğinden (böylece LPA, profil oluşturulmadan önce SM-DP+'dan profil meta verilerini alabilir ISD-R'den indirilmiş olması ya da profil devre dışı bırakıldığında ISD-R'den alması gerekir. profilde olduğu gibi operatör ayrıcalığı kuralı vardır.

eUICC OS ve SM-DP+, profilde özel bir etiketi (BF76) desteklemelidir meta verilerdir. Etiket içeriği, döndürülen operatör ayrıcalığı kurallarıyla aynı olmalıdır tarafından tanımlanan erişim kuralı applet'ı (ARA) tarafından UICC Operatörü Ayrıcalıkları:

RefArDo ::= [PRIVATE 2] SEQUENCE {  -- Tag E2
    refDo [PRIVATE 1] SEQUENCE {  -- Tag E1
        deviceAppIdRefDo [PRIVATE 1] OCTET STRING (SIZE(20|32)),  -- Tag C1
        pkgRefDo [PRIVATE 10] OCTET STRING (SIZE(0..127)) OPTIONAL  -- Tag CA
    },
    arDo [PRIVATE 3] SEQUENCE {  -- Tag E3
        permArDo [PRIVATE 27] OCTET STRING (SIZE(8))  -- Tag DB
    }
}

Uygulama imzalama hakkında daha fazla bilgi için bkz. Uygulamanızı imzalayın. Operatör ayrıcalıklarıyla ilgili ayrıntılar için UICC Operatörü Ayrıcalıkları.

Yerel profil asistanı uygulaması oluşturun

Cihaz üreticileri kendi yerel profil asistanlarını (LPA) kullanabilir. Bunlar her kullanıcının en iyi uygulamaları paylaşacağız. Aşağıdaki bölümlerde genel hatlarıyla bir LPA uygulaması yapma ve bunu Android sistemiyle entegre etme.

Donanım/modem gereksinimleri

eUICC çipindeki LPA ve eSIM en az GSMA RSP'yi desteklemelidir (Uzaktan Kumanda SIM Temel Hazırlığı) 2.0 veya 2.2 sürümü. Ayrıca SM-DP+ ve SM-DS'yi de kullanmayı planlamalısınız. eşleşen bir RSP sürümüne sahip sunucular. Ayrıntılı RSP mimarisi için GSMA SGP.21 RSP Mimari Spesifikasyonu.

Buna ek olarak, Android'deki eUICC API'leriyle entegrasyon 9, cihaz modemi terminal özelliklerini göndermelidir Kodlanmış eUICC özellikleri desteğiyle (yerel profil yönetimi ve profil indirme). Ayrıca aşağıdaki yöntemlerin uygulanması gerekir:

  • IRadio HAL v1.1: setSimPower
  • IRadio HAL v1.2: getIccCardStatus

  • IRadioConfig HAL 1.0 sürümü: getSimSlotsStatus

  • IRadioConfig AIDL 1.0 sürümü: getAllowedCarriers

    Google LPA'nın, yalnızca izin verilen operatör için eSIM indirme veya aktarma işlemlerine izin vermesi için operatör kilit durumunu bilmesi gerekir. Aksi takdirde, kullanıcılar bir SIM indirip aktararak daha sonra cihazın operatör tarafından farklı bir operatöre kilitlendiğini fark edebilirler.

    • Tedarikçi firmalar veya OEM'ler IRadioSim.getAllowedCarriers()HAL API'yi uygulamalıdır.

    • RIL / Modem tedarikçisi, cihazın IRadioSimResponse.getAllowedCarriersResponse()HAL API'sının bir parçası olarak kilitlendiği operatörün kilit durumunu ve operatör kimliğini girmelidir.

Modem, eSIM'i varsayılan başlatma profilindeki açık tutun.

Android 10 çalıştıran cihazlarda kaldırılamayan eUICC alan kimlik dizisi tanımlanmalıdır. Örneğin, bkz. arrays.xml.

<resources>
   <!-- Device-specific array of SIM slot indexes which are are embedded eUICCs.
        e.g. If a device has two physical slots with indexes 0, 1, and slot 1 is an
        eUICC, then the value of this array should be:
            <integer-array name="non_removable_euicc_slots">
                <item>1</item>
            </integer-array>
        If a device has three physical slots and slot 1 and 2 are eUICCs, then the value of
        this array should be:
            <integer-array name="non_removable_euicc_slots">
               <item>1</item>
               <item>2</item>
            </integer-array>
        This is used to differentiate between removable eUICCs and built in eUICCs, and should
        be set by OEMs for devices which use eUICCs. -->

   <integer-array name="non_removable_euicc_slots">
       <item>1</item>
   </integer-array>
</resources>

Modem gereksinimlerinin tam listesi için bkz. eSIM Desteği için Modem Gereksinimleri.

Euicc Hizmeti

Bir LPA iki ayrı bileşenden oluşur (her ikisi de aynı APK): LPA arka ucu ve LPA kullanıcı arayüzü veya LUI.

LPA arka ucunu uygulamak için EuiccService ve bu hizmeti manifest dosyanızda beyan edin. Hizmet, android.permission.BIND_EUICC_SERVICE sistem iznini kullanarak yalnızca bunun nasıl bağlanabileceğini konuşalım. Hizmet, aynı zamanda android.service.euicc.EuiccService işlemi Niyetin önceliği filtrenin sıfır dışında bir değere ayarlanması gerekir. cihazda bulunması gerekir. Örnek:

<service
    android:name=".EuiccServiceImpl"
    android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.EuiccService" />
    </intent-filter>
</service>

Android çerçevesi dahili olarak etkin LPA'yı belirler ve ve Android eUICC API'lerini desteklemek için gerektiği gibi. PackageManager şunun için sorgulandı: android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS izni olan tüm uygulamalar, Bu değer, android.service.euicc.EuiccService işlemi için bir hizmet belirtir. En yüksek önceliğe sahip hizmet seçilir. Hizmet bulunamazsa LPA desteği devre dışı bırakıldı.

LUI'yi uygulamak için aşağıdaki işlemlerle ilgili bir etkinlik sağlamanız gerekir:

  • android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
  • android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION

Hizmette olduğu gibi, her etkinlik için aşağıdaki bilgilerin sağlanması zorunludur: android.permission.BIND_EUICC_SERVICE sistem izni. Her birinin intent filtresini seçtikten sonra, android.service.euicc.category.EUICC_UI kategorisi ve sıfır olmayan bir öncelik. Bu etkinliklere ilişkin uygulamaları seçmek için benzer bir mantık kullanılır. proje yaşam döngüsü boyunca EuiccService. Örnek:

<activity android:name=".MyLuiActivity"
          android:exported="true"
          android:permission="android.permission.BIND_EUICC_SERVICE">
    <intent-filter android:priority="100">
        <action android:name="android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS" />
        <action android:name="android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.service.euicc.category.EUICC_UI" />
    </intent-filter>
</activity>

Bu, söz konusu ekranları uygulayan kullanıcı arayüzünün farklı bir ağdan gelebileceği anlamına gelir. APK'yı uygulayan EuiccService. Tek bir APK'ya mı yoksa birden fazla APK'ya mı (örneğin, EuiccService ve LUI etkinlikleri sağlayan) bir tasarım seçimidir.

EuiccCardYöneticisi

EuiccCardManager, eSIM çipiyle iletişim kurmak için kullanılan arayüzdür. Google ES10 işlevleri sağlar (GSMA RSP spesifikasyonunda açıklandığı gibi) ve hem de alt düzey APDU istek/yanıt komutlarını ve ASN.1 ayrıştırma sürecini destekler. EuiccCardManager bir sistem API'sidir ve yalnızca sistem ayrıcalığı olan kullanıcılar tarafından çağrılabilir

Operatör uygulamaları, LPA ve Euicc API&#39;leri

Şekil 2. Hem operatör uygulaması hem de LPA, Euicc API'lerini kullanır

EuiccCardManager üzerinden sağlanan profil işlemi API'leri, çağrıyı yapanın LPA'ya dokunun. Bu, Android çerçevesi tarafından zorunlu kılınır. Yani, arayan EuiccService öğesini uzatmalı ve manifest dosyanızda açıklandığı şekilde beyan edilmelidir: geri dönüp bakarsınız.

EuiccManager uygulamasına benzer şekilde, EuiccCardManager API'lerini kullanmak için LPA'nız önce şununla EuiccCardManager örneğini al: Context#getSystemService:

EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);

Sonra, eUICC'deki tüm profilleri almak için:

ResultCallback<EuiccProfileInfo[]> callback =
       new ResultCallback<EuiccProfileInfo[]>() {
           @Override
           public void onComplete(int resultCode,
                   EuiccProfileInfo[] result) {
               if (resultCode == EuiccCardManagerReflector.RESULT_OK) {
                   // handle result
               } else {
                   // handle error
               }
           }
       };

cardMgr.requestAllProfiles(eid, AsyncTask.THREAD_POOL_EXECUTOR, callback);

EuiccCardManager dahili olarak EuiccCardController öğesine bağlanır ( telefon işlemi) AIDL arayüzü ve her EuiccCardManager yöntemi üzerinden farklı ve özel bir AIDL aracılığıyla telefon işleminden geri arama alır arayüzü. EuiccCardManager API'lerini kullanırken çağrı yapanın (LPA) şunu sağlaması gerekir: Executor geri çağırma işlevinin çağrıldığı nesne. Bu Executor nesnesi şu cihazlarda çalışabilir: tek bir ileti dizisinde veya seçtiğiniz bir ileti dizisi havuzunda yayınlanabilir.

Çoğu EuiccCardManager API aynı kullanım modeline sahip. Örneğin, profil paketini eUICC'ye bağla:

...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

Belirli bir ICCID ile farklı bir profile geçmek için:

...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

eUICC çipinden varsayılan SM-DP+ adresini almak için:

...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
        callback);

Belirtilen bildirim etkinlikleriyle ilgili bildirim listesini almak için:

...
cardMgr.listNotifications(eid,
        EuiccNotification.Event.INSTALL
              | EuiccNotification.Event.DELETE /* events */,
        AsyncTask.THREAD_POOL_EXECUTOR, callback);

Bir operatör uygulaması üzerinden eSIM profilini etkinleştirme

Android 9 veya sonraki sürümleri çalıştıran cihazlarda operatör uygulamalarından birini kullanarak eSIM ve indirme profilleri. Operatör uygulaması, profilleri aşağıdaki yöntemlerle indirebilir. arama downloadSubscription veya LPA'ya etkinleştirme kodu sağlayarak.

Bir operatör uygulaması sesli arama yaparak bir profili indirdiğinde downloadSubscription Çağrı, uygulamanın bir BF76 üzerinden profili yönetebilmesini zorunlu tutuyor meta veri etiketi için operatör ayrıcalığı kurallarını kodlayan seçin. Bir profilde BF76 etiketi yoksa veya BF76 etiketi yoksa arayan operatör uygulamasının imzasıyla eşleşirse indirme işlemi reddedilir.

Aşağıdaki bölümde bir operatör uygulaması aracılığıyla eSIM'i etkinleştirme kodu.

Etkinleştirme kodu kullanarak eSIM'i etkinleştirin

eSIM profilini etkinleştirmek için etkinleştirme kodu kullanıldığında LPA, şuna ait etkinleştirme kodu: operatör uygulamasını indirip profili indirir. Bu akış LPA tarafından başlatılabilir. LPA, kullanıcı arayüzü akışının tamamını kontrol edebilir. Dolayısıyla, hiçbir operatör gösteriliyor. Bu yaklaşım, BF76 etiket kontrolünü atlar ve ağ operatörleri uygulama indirmesi de dahil olmak üzere eSIM etkinleştirme eSIM profili ve hata işleme.

Operatör eUICC temel hazırlık hizmetini tanımlayın

LPA ve operatör uygulaması, AIDL arayüzler: ICarrierEuiccProvisioningService ve IGetActivationCodeCallback. Kargo şirketi uygulama bir ICarrierEuiccProvisioningService arayüzü uygulamalı ve bunu uygulama içinde manifest beyanını kullanın. LPA, ICarrierEuiccProvisioningService öğesine bağlanmalı ve uygulamalıdır IGetActivationCodeCallback. Scrum ve Çevik’in nasıl uygulanacağı Bir AIDL arayüzü gösteriliyorsa (Tanımlama ve AIDL arayüzü'ne bakın).

AIDL arayüzlerini tanımlamak için aşağıdaki AIDL dosyalarını oluşturun hem LPA hem de operatör uygulamaları için

  • ICarrierEuiccProvisioningService.aidl

    package android.service.euicc;
    
    import android.service.euicc.IGetActivationCodeCallback;
    
    oneway interface ICarrierEuiccProvisioningService {
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the implementation of IGetActivationCodeCallback as the parameter.
        void getActivationCode(in IGetActivationCodeCallback callback);
    
        // The method to get the activation code from the carrier app. The caller needs to pass in
        // the activation code string as the first parameter and the implementation of
        // IGetActivationCodeCallback as the second parameter. This method provides the carrier
        // app the device EID which allows a carrier to pre-bind a profile to the device's EID before
        // the download process begins.
        void getActivationCodeForEid(in String eid, in IGetActivationCodeCallback callback);
    }
    
    
  • IGetActivationCodeCallback.aidl

    package android.service.euicc;
    
    oneway interface IGetActivationCodeCallback {
        // The call back method needs to be called when the carrier app gets the activation
        // code successfully. The caller needs to pass in the activation code string as the
        // parameter.
        void onSuccess(String activationCode);
    
        // The call back method needs to be called when the carrier app failed to get the
        // activation code.
        void onFailure();
    }
    

Örnek LPA uygulaması

Operatör uygulamasının ICarrierEuiccProvisioningService uygulamasına bağlamak için LPA, hem ICarrierEuiccProvisioningService.aidl hem de IGetActivationCodeCallback.aidl ayarını projenize ekleyin ServiceConnection.

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    mCarrierProvisioningService = ICarrierEuiccProvisioningService.Stub.asInterface(iBinder);
}

Operatör uygulamasının ICarrierEuiccProvisioningService cihazına bağlandıktan sonra LPA, getActivationCode veya RACI matrisi getActivationCodeForEid tarihine kadar operatör uygulamasından etkinleştirme kodunu alın IGetActivationCodeCallback saplama sınıfının uygulanmasını iletir.

getActivationCode ile getActivationCodeForEid arasındaki fark şu: getActivationCodeForEid, operatörün bir profili cihazın hesabına önceden bağlamasına olanak tanır. İndirme işlemi başlamadan önce SIM kimliği belirleyin.

void getActivationCodeFromCarrierApp() {
    IGetActivationCodeCallback.Stub callback =
            new IGetActivationCodeCallback.Stub() {
                @Override
                public void onSuccess(String activationCode) throws RemoteException {
                    // Handle the case LPA success to get activation code from a carrier app.
                }

                @Override
                public void onFailure() throws RemoteException {
                    // Handle the case LPA failed to get activation code from a carrier app.
                }
            };
    
    try {
        mCarrierProvisioningService.getActivationCode(callback);
    } catch (RemoteException e) {
        // Handle Remote Exception
    }
}

Operatör uygulaması için örnek uygulama

LPA'nın operatör uygulamasına bağlanması için operatör uygulaması ICarrierEuiccProvisioningService.aidl ve IGetActivationCodeCallback.aidl- ve ICarrierEuiccProvisioningService hizmetini AndroidManifest.xml dosyası. Hizmet, android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS sistem izninin olması gerekir. buna yalnızca sisteme özel bir uygulama olan LPA bağlanabilir. Hizmet, aynı zamanda bir intent filtresi de android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE işlem.

  • AndroidManifest.xml

    <application>
      ...
      <service
          android:name=".CarrierEuiccProvisioningService"
          android:exported="true"
          android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS">
        <intent-filter>
          <action android:name="android.service.euicc.action.BIND_CARRIER_PROVISIONING_SERVICE"/>
        </intent-filter>
      </service>
      ...
    </application>
    

AIDL operatör uygulaması hizmetini kullanmak için bir hizmet oluşturun, Stub getActivationCode ve getActivationCodeForEid özelliklerini uygulayın. yöntemlerine göz atın. Ardından LPA, profil etkinleştirmeyi getirmek için iki yöntemden birini çağırabilir girin. Operatör uygulaması Kod şöyle ise etkinleştirme koduyla IGetActivationCodeCallback#onSuccess operatörün sunucusundan başarıyla alındı. Başarısız olursa operatör uygulaması IGetActivationCodeCallback#onFailure ile yanıt vermelidir.

  • CarrierEuiccProvisioningService.java

    import android.service.euicc.ICarrierEuiccProvisioningService;
    import android.service.euicc.ICarrierEuiccProvisioningService.Stub;
    import android.service.euicc.IGetActivationCodeCallback;
    
    public class CarrierEuiccProvisioningService extends Service {
        private final ICarrierEuiccProvisioningService.Stub binder =
            new Stub() {
              @Override
              public void getActivationCode(IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary to get an activation code (HTTP requests to carrier server, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
    
              @Override
              public void getActivationCodeForEid(String eid, IGetActivationCodeCallback callback) throws RemoteException {
                String activationCode = // do whatever work necessary (HTTP requests, fetch from storage, etc.)
                callback.onSuccess(activationCode);
              }
          }
    }
    

LPA etkinleştirme akışında operatör uygulaması kullanıcı arayüzünü başlatın

LPA, Android 11 ve sonraki sürümleri çalıştıran cihazlarda bir operatör uygulamasının kullanıcı arayüzünü başlatın. Bir operatör uygulaması, operatörden gelen ek bilgileri gerektirebilir. kullanıcı tarafından bir kez daha gönderin. Örneğin, kargo şirketleri Kullanıcıların, telefon numaralarını etkinleştirmek veya başka taşıma işlemleri gerçekleştirmek için giriş yapmasını gerektirme kullanıma sunuyoruz.

Bir operatör uygulamasının LPA'da kullanıcı arayüzünü başlatma süreci şu şekildedir:

  1. LPA, operatör uygulamasının etkinleştirme akışını başlatmak için android.service.euicc.action.START_CARRIER_ACTIVATION amacı işlemi içeren operatör uygulama paketi (Operatör uygulamasının alıcısı manifestoda, android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" - LPA olmayan uygulamalardan niyet almaktan kaçının.)

    String packageName = // The carrier app's package name
    
    Intent carrierAppIntent =
        new Intent(“android.service.euicc.action.START_CARRIER_ACTIVATION”)
            .setPackage(packageName);
    
    ResolveInfo activity =
        context.getPackageManager().resolveActivity(carrierAppIntent, 0);
    
    carrierAppIntent
        .setClassName(activity.activityInfo.packageName, activity.activityInfo.name);
    
    startActivityForResult(carrierAppIntent, requestCode);
    
  2. Operatör uygulaması bu işlemleri kendi kullanıcı arayüzünü kullanarak yapar. Örneğin, günlük HTTP isteklerinde bulunmayıp operatörün arka ucuna göndermeyi unutmayın.

  3. Operatör uygulaması, LPA'ya setResult(int, Intent) numaralı telefonu arayarak yanıt verir. ve finish().

    1. Operatör uygulaması RESULT_OK ile yanıt verirse LPA etkinleştirme akışına devam eder. Operatör uygulaması LPA'nın operatöre bağlanmasına izin vermek yerine kullanıcı bir QR kodu taramalıdır hizmeti bulunduğunda, operatör uygulaması LPA'ya RESULT_OK ve Intent örneğiyle setResult(int, Intent) ekstra Boole değerini içeren android.telephony.euicc.extra.USE_QR_SCANNER, true olarak ayarlandı. LPA ardından ekstraları kontrol eder ve bağlama yerine QR tarayıcıyı başlatır operatör uygulamasının ICarrierEuiccProvisioningService uygulaması.
    2. Operatör uygulaması kilitlenirse veya RESULT_CANCELED ile yanıt verirse (bu varsayılan yanıt kodudur), LPA eSIM'i iptal eder etkinleştirme akışı.
    3. Operatör uygulaması RESULT_OK veya RESULT_CANCELED ise LPA bunu hata olarak değerlendirir.

    Güvenlik nedeniyle, LPA aşağıdaki şartları doğrudan kabul etmemelidir: LPA olmayan içeriğin genel olarak Arayanlar operatör uygulamasından etkinleştirme kodu alamıyor.

Bir operatör uygulamasında LPA etkinleştirme akışını başlatın

Android 11'den itibaren operatör uygulamaları eUICC API'lerini kullanabilir eSIM için LUI başlatma etkinleştirme. Bu yöntem, LPA'nın eSIM etkinleştirme akışı kullanıcı arayüzünü gösterir. eSIM profili. LPA daha sonra eSIM profili etkinleştirme sona erer.

  1. LPA, android.service.euicc.action.START_EUICC_ACTIVATION işlem. Öncelik olması durumunda, amaç filtresinin değeri sıfır dışında bir değere ayarlanmalıdır. uygulamalar olduğundan emin olun. Örnek:

    <application>
      ...
    <activity
        android:name=".CarrierAppInitActivity"
        android:exported="true">
    
        <intent-filter android:priority="100">
            <action android:name="android.service.euicc.action.START_EUICC_ACTIVATION" />
        </intent-filter>
    </activity>
      ...
    </application>
    
  2. Operatör uygulaması bu işlemleri kendi kullanıcı arayüzünü kullanarak yapar. Örneğin, günlük HTTP isteklerinde bulunmayıp operatörün arka ucuna göndermeyi unutmayın.

  3. Operatör uygulamasının bu noktada etkinleştirme sağlamaya hazır olması gerekir kodu yerine ICarrierEuiccProvisioningService uygulaması gerekir. İlgili içeriği oluşturmak için kullanılan operatör uygulaması LPA'yı başlatarak startActivityForResult(Intent, int) android.telephony.euicc.action.START_EUICC_ACTIVATION eyleme dökülebilir. LPA, aynı zamanda ekstra boole değerini de kontrol eder. android.telephony.euicc.extra.USE_QR_SCANNER Değer true ise LPA, kullanıcının profil QR kodunu tarayabilmesi için QR tarayıcıyı başlatır.

  4. LPA tarafında, LPA operatör uygulamasının Etkinleştirmeyi getirmek için ICarrierEuiccProvisioningService uygulaması kodu indirin ve ilgili profili indirin. LPA, İndirme sırasında, yükleme ekranı gibi kullanıcı arayüzü öğeleri.

  5. LPA etkinleştirme akışı tamamlandığında LPA, operatör uygulaması tarafından işlenir ve sonuç koduyla birlikte onActivityResult(int, int, Intent)

    1. LPA, yeni eSIM profilini başarıyla indirirse RESULT_OK ile yanıt verir.
    2. Kullanıcı LPA'da eSIM profili etkinleştirme işlemini iptal ederse RESULT_CANCELED ile yanıt verir.
    3. LPA RESULT_OK dışında bir yanıt verirse RESULT_CANCELED, operatör uygulaması bunu bir hata olarak değerlendirir.

    LPA, güvenlik nedeniyle etkinleştirme kodunu kabul etmez ASA olmayan arayanların arama anlayamamasını sağlamak için operatör uygulamasından etkinleştirme kodu.

Birden fazla eSIM desteği

Android 10 veya sonraki sürümleri çalıştıran cihazlarda EuiccManager sınıfında cihazlar desteklenir birden fazla eSIM'i kullanabilirsiniz. Yükseltme yapılan tek bir eSIM'i olan cihazlar Android 10 Platform olarak LPA uygulamasında herhangi bir değişiklik gerektirmemelidir. EuiccManager örneğini otomatik olarak varsayılan eUICC ile ilişkilendirir. İlgili içeriği oluşturmak için kullanılan varsayılan eUICC, radyo HAL sürümüne sahip cihazlar için platform tarafından belirlenir 1.2 veya üzeri ve LPA tarafından şu radyo HAL sürümlerine sahip cihazlar için: 1.2.

Gereksinimler

Birden fazla eSIM'i desteklemek için cihazda birden fazla eUICC olmalıdır. Çıkarılabilir eUICC'lerin kullanılabileceği yerleşik bir eUICC ya da fiziksel bir SIM yuvası olmalıdır eklendi.

Birden fazla eSIM'i desteklemek için Radyo HAL sürüm 1.2 veya üzeri gerekir. HAL Radyosu sürüm 1.4 ve RadioConfig HAL sürüm 1.2 önerilir.

Uygulama

Birden fazla eSIM'i (çıkarılabilir eUICC'ler veya programlanabilir SIM'ler dahil) desteklemek için LPA uygulanmalıdır EuiccService bu alana, arayan tarafından sağlanan kart kimliğine karşılık gelen alan kimliğini alır.

İlgili içeriği oluşturmak için kullanılan non_removable_euicc_slots şurada belirtilen kaynak: arrays.xml bir cihazın yerleşik cihazındaki yuva kimliklerini temsil eden bir tam sayı dizisidir eUICC'ler. Platformun, uygulamanızın eklenen eUICC'nin çıkarılabilir olup olmadığını gösterir.

Birden fazla eSIM'i olan cihazlar için operatör uygulaması

Birden fazla eSIM'i olan bir cihaz için operatör uygulaması geliştirirken createForCardId yöntemini EuiccManager kullanarak belirli bir EuiccManager nesnesini belirtilen kart kimliği. Kart kimliği, UICC'yi benzersiz şekilde tanımlayan bir tam sayı değeridir. veya cihazda bir eUICC olmalıdır.

Cihazın varsayılan eUICC'sinin kart kimliğini almak için getCardIdForDefaultEuicc yöntemini TelephonyManager içinde değiştirebilirsiniz. Bu yöntem, UNSUPPORTED_CARD_ID radyo HAL sürümü 1.2'den düşükse ve UNINITIALIZED_CARD_ID cihaz eUICC'yi okumadıysa.

Kart kimliklerini şuradan da alabilirsiniz: getUiccCardsInfo ve TelephonyManager içinde getUiccSlotsInfo (system API) ve getCardId SubscriptionInfo içinde.

Belirli bir kart kimliğiyle bir EuiccManager nesnesi örneklendirildiğinde işlemleri, söz konusu kart kimliğiyle eUICC'ye yönlendirilir. eUICC erişilemez (örneğin, kapatıldığında veya kaldırıldığında) EuiccManager hayır daha uzun süre çalışır.

Bir operatör uygulaması oluşturmak için aşağıdaki kod örneklerini kullanabilirsiniz.

1. Örnek: Etkin aboneliği alma ve EuiccManager örneğini örneklendirme

// Get the active subscription and instantiate an EuiccManager for the eUICC which holds
// that subscription
SubscriptionManager subMan = (SubscriptionManager)
        mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
int cardId = subMan.getActiveSubscriptionInfo().getCardId();
EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(cardId);

Örnek 2: UICC'leri yineleyin ve bir için EuiccManager çıkarılabilir eUICC

// On a device with a built-in eUICC and a removable eUICC, iterate through the UICC cards
// to instantiate an EuiccManager associated with a removable eUICC
TelephonyManager telMan = (TelephonyManager)
        mContext.getSystemService(Context.TELEPHONY_SERVICE);
List<UiccCardInfo> infos = telMan.getUiccCardsInfo();
int removableCardId = -1; // valid cardIds are 0 or greater
for (UiccCardInfo info : infos) {
    if (info.isRemovable()) {
        removableCardId = info.getCardId();
        break;
    }
}
if (removableCardId != -1) {
    EuiccManager euiccMan = (EuiccManager) mContext.getSystemService(Context.EUICC_SERVICE)
            .createForCardId(removableCardId);
}

Doğrulama

AOSP, bir LPA uygulaması içermez ve tüm Android sürümlerinde LPA'yı kullanabilirsiniz (her telefon eSIM'i desteklemez). Örneğin, bu nedenle uçtan uca CTS test durumu yoktur. Ancak temel test durumları, korunmasız eUICC API'lerinin sağlandığından emin olmak için AOSP'de Android derlemelerinde geçerlidir.

Derlemelerin aşağıdaki CTS test durumlarını geçtiğinden emin olmalısınız (herkese açık API'ler): /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts

Bir operatör uygulamasını kullanan operatörler normal şirket içi kalite kontrolü döngüleri düzenli bir şekilde kontrol etmeniz gerekir. Şurada: minimum olarak, operatör uygulaması tüm abonelik profillerini listeleyebilmelidir. sahibi olma, bir profili indirme ve yükleme, bir hizmeti etkinleştirme profil oluşturabilir, profiller arasında geçiş yapabilir ve profilleri silebilirsiniz.

Kendi LPA'nızı oluşturuyorsanız çok daha ayrıntılı olmalıdır. teşvik etmek anlamına gelir. Modem satıcınız, eUICC çipi veya eSIM OS tedarikçinizle birlikte çalışmalısınız. SM-DP+ tedarikçileri ile operatörlerinin ve operatörlerin, sorunları çözmek ve LPA'nızı RSP mimarisi içinde göstermeniz gerekir. İyi miktarda manuel test yapmak kaçınılmazdır. En iyi test kapsamı için GSMA SGP.23 RSP Test Planı.