eUICC API'leri

Android 9'da profil yönetimi API'leri (public ve @SystemApi), EuiccManager sınıfı üzerinden kullanılabilir. eUICC iletişimi API'leri (yalnızca @SystemApi) EuiccCardManager sınıfı üzerinden kullanılabilir.

eUICC hakkında

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

Operatör uygulaması ve OEM LPA'sı olan Android telefon

1. şekil. Operatör uygulaması ve OEM LPA'sı olan Android telefonlar

LPA uygulamaları, EuiccCardManager numarayı arama 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+ sunucusuyla iletişim kuran SM-DP+ istemcisi
  • [İsteğe bağlı] Daha fazla indirilebilir profil elde etmek için SM-DS
  • Profil durumunu güncellemek için sunucuya bildirim göndermeye yönelik bildirim işleme
  • [İsteğe bağlı] eSIM ve pSIM mantığı arasında geçiş yapma dahil olmak üzere yuva yönetimi. Telefon yalnızca eSIM çipine sahipse bu adım isteğe bağlıdır.
  • eSIM OTA

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

EuiccManager'ı kullanma

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

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

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

Birden fazla etkinleştirilmiş profil API'si hakkında bilgi edinmek için Birden fazla etkinleştirilmiş profil başlıklı makaleyi inceleyin.

API'ler

Aşağıdaki API'leri EuiccManager referans belgelerinde ve EuiccManager.java bulabilirsiniz.

Örnek alma (herkese açık)

EuiccManager ile Context#getSystemService arasındaki örneği alır. Ayrıntılı bilgi için getSystemService başlıklı makaleyi inceleyin.

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

Etkinleştirilmiş (herkese açık)

Yerleştirilmiş aboneliğin etkin olup olmadığını kontrol eder. Bu, LPA API'lerine erişmeden önce kontrol edilmelidir. Ayrıntılı bilgi için isEnabled başlıklı makaleyi inceleyin.

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

EID (public) alma

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

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

GetEuiccInfo (herkese açık)

eUICC hakkında bilgi alır. Bu, işletim sistemi sürümünü içerir. Ayrıntılı bilgi için getEuiccInfo başlıklı makaleyi inceleyin.

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

Aboneliği indirme (herkese açık)

Belirtilen aboneliği (GSMA RSP belgelerinde "profil" olarak adlandırılır) indirir. Abonelik, etkinleştirme koduyla oluşturulabilir. Örneğin, etkinleştirme kodu bir QR kodundan ayrıştırılabilir. Abonelik indirme işlemi eşzamansızdır.

Arayan kullanıcının WRITE_EMBEDDED_SUBSCRIPTIONS izni olmalı veya hedef abonelik için operatör ayrıcalıklarına sahip olmalıdır. Ayrıntılı bilgi için downloadSubscription başlıklı makaleyi inceleyin.

// 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ştirme (herkese açık)

Belirtilen aboneliğe geçer (etkinleştirir). Arayanın, etkin olan mevcut abonelik ve hedef abonelik için WRITE_EMBEDDED_SUBSCRIPTIONS veya operatör ayrıcalıkları olmalıdır. Ayrıntılı bilgi için switchToSubscription başlıklı makaleyi inceleyin.

// 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);

Taşıma işlemiyle aboneliği değiştirme (herkese açık)

(Android 13'ten itibaren kullanılabilir) Belirtilen bağlantı noktası dizinine sahip aboneliğe geçer (etkinleştirir). Arayanın, etkinleştirilmiş mevcut abonelik ve hedef abonelik için WRITE_EMBEDDED_SUBSCRIPTIONS veya operatör ayrıcalıkları olmalıdır. Ayrıntılı bilgi için switchToSubscription başlıklı makaleyi inceleyin.

// 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ı kullanılabilir mi (herkese açık)?

public boolean isSimPortAvailable(int portIndex)

(Android 13'ten itibaren kullanılabilir) Geçiş kartı bağlantı noktası dizininin kullanılabilir olup olmadığını döndürür. Abonelik etkinleştirilmemişse veya arama uygulaması, seçilen bağlantı noktasına yüklenen abonelik üzerinde operatör ayrıcalığına sahipse bağlantı noktası kullanılabilir. Ayrıntılı bilgi için isSimPortAvailable başlıklı makaleyi inceleyin.

Aboneliği silme (herkese açık)

Abonelik kimliğiyle aboneliği siler. Abonelik şu anda etkinse önce 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ılı bilgi için deleteSubscription başlıklı makaleyi inceleyin.

// 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 silme (sistem API'si)

Cihazdaki tüm abonelikleri siler. Android 11'den itibaren, tüm test, operasyonel veya her iki türdeki aboneliğin de silinip silinmeyeceğini belirtmek için bir EuiccCardManager#ResetOption enum değeri sağlamanız gerekir. Arayanın WRITE_EMBEDDED_SUBSCRIPTIONS izni olmalıdır.

// 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şlatma (herkese açık)

Kullanıcı tarafından çözülebilen bir hatayı düzeltmek için etkinlik başlatır. Bir işlem EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR 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

public içindeki EuiccManager sabitlerinin listesini görmek için Sabitler başlıklı makaleyi inceleyin.