Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

API eUICC

Di Android 9, API pengelolaan profil (publik dan @SystemApi) tersedia melalui kelas EuiccManager . API komunikasi eUICC (hanya @SystemApi) tersedia melalui kelas EuiccCardManager .

Tentang eUICC

Operator dapat membuat aplikasi operator menggunakan EuiccManager untuk mengelola profil, seperti yang ditunjukkan pada Gambar 1. Aplikasi operator tidak perlu berupa aplikasi sistem tetapi harus memiliki hak istimewa operator yang diberikan oleh profil eUICC. Aplikasi LPA (LUI dan backend LPA) harus berupa aplikasi sistem (yaitu, disertakan dalam image sistem) untuk memanggil @SystemApi.

Ponsel Android dengan Aplikasi Operator dan OEM LPA

Gambar 1. Ponsel Android dengan aplikasi operator dan LPA OEM

Selain logika memanggil EuiccCardManager dan berbicara dengan eUICC, aplikasi LPA harus mengimplementasikan hal berikut:

  • Klien SM-DP + berbicara dengan server SM-DP + untuk mengautentikasi dan mengunduh profil
  • [Opsional] SM-DS untuk mendapatkan lebih banyak profil potensial yang dapat diunduh
  • Penanganan pemberitahuan untuk mengirim pemberitahuan ke server untuk memperbarui status profil
  • [Opsional] Manajemen slot termasuk peralihan antara logika eSIM dan pSIM. Ini opsional jika ponsel hanya memiliki chip eSIM.
  • eSIM OTA

Meskipun lebih dari satu aplikasi LPA dapat hadir di ponsel Android, hanya satu LPA yang dapat dipilih untuk menjadi LPA yang berfungsi sebenarnya berdasarkan prioritas yang ditentukan dalam file AndroidManifest.xml dari setiap aplikasi.

Menggunakan EuiccManager

LPA API bersifat publik melalui EuiccManager (di bawah paket android.telephony.euicc ). Aplikasi operator bisa mendapatkan instance EuiccManager , dan memanggil metode di EuiccManager untuk mendapatkan informasi eUICC dan mengelola langganan (disebut sebagai profil dalam dokumen GSMA RSP) sebagai instance SubscriptionInfo.

Untuk memanggil API publik termasuk mengunduh, beralih, dan menghapus operasi langganan, aplikasi operator harus memiliki hak istimewa yang diperlukan. Hak istimewa operator ditambahkan oleh operator seluler di metadata profil. API eUICC memberlakukan aturan hak istimewa operator yang sesuai.

Platform Android tidak menangani aturan kebijakan profil. Jika aturan kebijakan dideklarasikan dalam metadata profil, LPA dapat memilih cara menangani prosedur pengunduhan dan penginstalan profil. Misalnya, dimungkinkan untuk LPA OEM pihak ketiga untuk menangani aturan kebijakan menggunakan kode kesalahan khusus (kode kesalahan diteruskan dari OEM LPA ke platform, kemudian platform meneruskan kode ke OEM LUI).

Lebah

API berikut dapat ditemukan dalam EuiccManager dokumentasi referensi dan EuiccManager.java .

Dapatkan instance (publik)

Mendapatkan instance EuiccManager melalui Context#getSystemService .

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

Centang diaktifkan (publik)

Memeriksa apakah langganan tertanam diaktifkan. Ini harus diperiksa sebelum mengakses LPA API.

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

Dapatkan EID (publik)

Mendapatkan EID yang mengidentifikasi perangkat keras eUICC. Ini mungkin nol jika eUICC belum siap. Penelepon harus memiliki hak istimewa operator atau izin READ_PRIVILEGED_PHONE_STATE .

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

Dapatkan EuiccInfo (publik)

Mendapatkan informasi tentang eUICC. Ini berisi versi OS.

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

Unduh langganan (publik)

Unduh langganan yang diberikan (disebut sebagai "profil" dalam dokumen GSMA RSP). Langganan dapat dibuat dari kode aktivasi. Misalnya, kode aktivasi dapat diurai dari kode QR. Mendownload langganan adalah operasi asinkron.

Penelepon harus memiliki izin WRITE_EMBEDDED_SUBSCRIPTIONS atau memiliki hak istimewa operator untuk langganan target.

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

Alihkan langganan (publik)

Beralih ke (mengaktifkan) langganan yang diberikan. Penelepon harus memiliki WRITE_EMBEDDED_SUBSCRIPTIONS atau memiliki hak istimewa operator untuk langganan yang diaktifkan saat ini dan langganan target.

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

Hapus langganan (publik)

Menghapus langganan dengan ID langganan. Jika langganan saat ini aktif, pertama kali dinonaktifkan. Penelepon harus memiliki WRITE_EMBEDDED_SUBSCRIPTIONS atau hak istimewa operator untuk langganan target.

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

Hapus semua langganan (API sistem)

Menghapus semua langganan di perangkat. Mulai Android 11, Anda harus memberikan nilai enum EuiccCardManager#ResetOption untuk menentukan apakah akan menghapus semua pengujian, operasional, atau kedua jenis langganan. Penelepon harus memiliki izin WRITE_EMBEDDED_SUBSCRIPTIONS .

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

Mulai aktivitas resolusi (publik)

Memulai aktivitas untuk mengatasi kesalahan yang dapat diatasi pengguna. Jika operasi mengembalikan EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR , metode ini dapat dipanggil untuk meminta pengguna menyelesaikan masalah. Metode ini hanya dapat dipanggil sekali untuk kesalahan tertentu.

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

Konstanta

Untuk melihat daftar konstanta public di EuiccManager , lihat Konstanta .