eUICC API'leri

Android 9'da, profil yönetimi API'leri (genel ve @SystemApi) EuiccManager sınıfı aracılığıyla kullanılabilir. eUICC iletişim API'leri (@yalnızcaSystemApi) EuiccCardManager sınıfı aracılığıyla kullanılabilir.

eUICC hakkında

Operatörler, Şekil 1'de gösterildiği gibi, profilleri yönetmek için EuiccManager'ı kullanarak operatör uygulamaları oluşturabilir. Operatör uygulamalarının sistem uygulamaları olması gerekmez, ancak eUICC profilleri tarafından verilen operatör ayrıcalıklarına sahip olmaları gerekir. Bir LPA uygulamasının (LUI ve LPA arka ucu), @SystemApi'yi çağırabilmesi için bir sistem uygulaması olması (yani sistem görüntüsünde yer alması) gerekir.

Carrier Uygulaması ve OEM LPA'ya sahip Android telefon

Şekil 1. Operatör uygulamasına ve OEM LPA'ya sahip Android telefonlar

LPA uygulamaları, EuiccCardManager çağırma ve eUICC ile konuşma mantığının yanı sıra aşağıdakileri de uygulamalıdır:

  • Kimlik doğrulamak ve profilleri indirmek için SM-DP+ istemcisi SM-DP+ sunucusuyla konuşuyor
  • [İsteğe bağlı] Daha fazla potansiyel indirilebilir profil elde etmek için SM-DS
  • Profil durumunu güncellemek için sunucuya bildirim göndermek için bildirim işleme
  • [İsteğe Bağlı] eSIM ve pSIM mantığı arasında geçiş yapmayı içeren yuva yönetimi. Telefonda yalnızca bir eSIM çipi varsa bu isteğe bağlıdır.
  • eSIM OTA

Bir Android telefonda birden fazla LPA uygulaması bulunabilmesine rağmen, her uygulamanın AndroidManifest.xml dosyasında tanımlanan önceliğe dayalı olarak gerçek çalışan LPA olarak yalnızca bir LPA seçilebilir.

EuiccManager'ı kullanma

LPA API'leri EuiccManager aracılığıyla herkese açıktır ( android.telephony.euicc paketi altında). Bir operatör uygulaması EuiccManager örneğini alabilir ve eUICC bilgilerini almak ve abonelikleri (GSMA RSP belgelerinde profiller olarak anılır) SubscriptionInfo örnekleri olarak yönetmek için EuiccManager yöntemleri çağırabilir.

Abonelik işlemlerini indirme, değiştirme ve silme dahil genel API'leri çağırmak için operatör uygulamasının gerekli ayrıcalıklara sahip olması gerekir. Operatör ayrıcalıkları mobil operatör tarafından profil meta verilerine eklenir. eUICC API, taşıyıcı ayrıcalık kurallarını buna göre uygular.

Android platformu profil politikası kurallarını işlemez. Profil meta verilerinde bir politika kuralı bildirilirse LPA, profil indirme ve yükleme prosedürünün nasıl işleneceğini seçebilir. Örneğin, üçüncü taraf bir OEM LPA'nın özel bir hata kodu kullanarak ilke kurallarını işlemesi mümkündür (hata kodu OEM LPA'dan platforma iletilir, ardından platform kodu OEM LUI'ye iletir).

Birden çok etkin profil API'si hakkında bilgi için bkz. Birden çok etkin profil .

API'ler

Aşağıdaki API'ler EuiccManager referans belgelerinde ve EuiccManager.java bulunabilir.

Örnek alın (herkese açık)

EuiccManager örneğini Context#getSystemService aracılığıyla alır. Ayrıntılar için getSystemService bakın.

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

Etkinleştir (genel) seçeneğini işaretleyin

Katıştırılmış aboneliğin etkin olup olmadığını kontrol eder. LPA API'lerine erişmeden önce bunun kontrol edilmesi gerekir. Ayrıntılar için bkz. isEnabled .

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

EID'yi alın (herkese açık)

eUICC donanımını tanımlayan EID'yi alır. eUICC hazır değilse bu boş olabilir. Arayanın operatör ayrıcalığına veya READ_PRIVILEGED_PHONE_STATE iznine sahip olması gerekir. Ayrıntılar için getEid bakın.

String eid = mgr.getEid();
if (eid == null) {
  // Handle null case.
}

EuiccInfo'yu edinin (genel)

eUICC hakkında bilgi alır. Bu, işletim sistemi sürümünü içerir. Ayrıntılar için getEuiccInfo bakın.

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

Aboneliği indirin (herkese açık)

Belirtilen aboneliği indirir (GSMA RSP belgelerinde "profil" olarak anılır). Abonelik bir aktivasyon kodundan oluşturulabilir. Örneğin, bir aktivasyon kodu bir QR kodundan ayrıştırılabilir. Aboneliğin indirilmesi eşzamansız bir işlemdir.

Arayanın hedef abonelik için WRITE_EMBEDDED_SUBSCRIPTIONS iznine veya operatör ayrıcalıklarına sahip olması gerekir. Ayrıntılar için downloadSubscription bakın.

// Register receiver.
String action = "download_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/, null /* handler */);

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

Aboneliği değiştir (herkese açık)

Verilen aboneliğe geçiş yapar (etkinleştirir). Arayanın WRITE_EMBEDDED_SUBSCRIPTIONS sahip olması veya mevcut etkin abonelik ve hedef abonelik için operatör ayrıcalıklarına sahip olması gerekir. Ayrıntılar için bkz. switchToSubscription .

// Register receiver.
String action = "switch_to_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/, null /* handler */);

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

Aboneliği bağlantı noktasıyla değiştir (genel)

(Android 13'te mevcuttur) Belirtilen bağlantı noktası dizini ile verilen aboneliğe geçiş yapar (etkinleştirir). Arayanın WRITE_EMBEDDED_SUBSCRIPTIONS sahip olması veya mevcut etkin abonelik ve hedef abonelik için operatör ayrıcalıklarına sahip olması gerekir. Ayrıntılar için bkz. switchToSubscription .

// Register receiver.
String action = "switch_to_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/, null /* handler */);

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

SIM bağlantı noktası mevcut mu (herkese açık)

public boolean isSimPortAvailable(int portIndex)

(Android 13'te mevcuttur) Geçen bağlantı noktası dizininin mevcut olup olmadığını döndürür. Abonelik etkin değilse veya arayan uygulamanın, seçilen bağlantı noktasında yüklü abonelik üzerinde operatör ayrıcalığı varsa, bağlantı noktası kullanılabilir. Ayrıntılar için bkz. isSimPortAvailable .

Aboneliği sil (herkese açık)

Abonelik kimliğine sahip bir aboneliği siler. Abonelik şu anda etkinse öncelikle devre dışı bırakılır. Arayanın, hedef abonelik için WRITE_EMBEDDED_SUBSCRIPTIONS veya operatör ayrıcalıklarına sahip olması gerekir. Ayrıntılar için bkz. deleteSubscription .

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Delete a subscription asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.deleteSubscription(1 /* subscriptionId */, callbackIntent);

Tüm abonelikleri sil (sistem API'si)

Bir cihazdaki tüm abonelikleri siler. Android 11'den itibaren tüm test, operasyonel veya her iki abonelik türünün de silineceğini belirtmek için bir EuiccCardManager#ResetOption numaralandırma değeri sağlamanız gerekir. Arayanın WRITE_EMBEDDED_SUBSCRIPTIONS iznine sahip olması gerekir.

// Register receiver.
String action = "delete_subscription";
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),
        "example.broadcast.permission" /* broadcastPermission*/,
        null /* handler */);

// Erase all operational subscriptions asynchronously.
Intent intent = new Intent(action);
PendingIntent callbackIntent = PendingIntent.getBroadcast(
        getContext(), 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.eraseSubscriptions(
        EuiccCardManager.RESET_OPTION_DELETE_OPERATIONAL_PROFILES, callbackIntent);

Çözümleme etkinliğini başlat (herkese açık)

Kullanıcı tarafından çözülebilen bir hatayı çözmek için bir etkinlik başlatır. Bir işlem EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR değerini döndürürse, kullanıcıdan sorunu çözmesini istemek için bu yöntem çağrılabilir. Bu yöntem belirli bir hata için yalnızca bir kez çağrılabilir.

...
mgr.startResolutionActivity(getActivity(), 0 /* requestCode */, resultIntent, callbackIntent);

Sabitler

EuiccManager public sabitlerin listesini görmek için bkz . Sabitler .