Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

API de eUICC

En Android 9, las API de administración de perfiles (públicas y @SystemApi) están disponibles a través de la clase EuiccManager . Las API de comunicación eUICC (solo @SystemApi) están disponibles a través de la clase EuiccCardManager .

Sobre eUICC

Los operadores pueden crear aplicaciones de operador usando EuiccManager para administrar perfiles, como se muestra en la Figura 1. Las aplicaciones de operador no necesitan ser aplicaciones del sistema, pero necesitan tener privilegios de operador otorgados por perfiles eUICC. Una aplicación LPA (backend LUI y LPA) debe ser una aplicación del sistema (es decir, incluida en la imagen del sistema) para llamar a @SystemApi.

Teléfono Android con aplicación Carrier y OEM LPA

Figura 1. Teléfonos Android con aplicación de operador y OEM LPA

Además de la lógica de llamar a EuiccCardManager y hablar con eUICC, las aplicaciones LPA deben implementar lo siguiente:

  • Cliente SM-DP + hablando con el servidor SM-DP + para autenticar y descargar perfiles
  • [Opcional] SM-DS para obtener más perfiles descargables potenciales
  • Manejo de notificaciones para enviar notificaciones al servidor para actualizar el estado del perfil
  • [Opcional] Gestión de ranuras que incluye el cambio entre lógica eSIM y pSIM. Esto es opcional si el teléfono solo tiene un chip eSIM.
  • eSIM OTA

Aunque puede haber más de una aplicación LPA en un teléfono Android, solo se puede seleccionar una LPA para que sea la LPA de trabajo real según la prioridad definida en el archivo AndroidManifest.xml de cada aplicación.

Usando EuiccManager

Las API de LPA son públicas a través de EuiccManager (en el paquete android.telephony.euicc ). Una aplicación de operador puede obtener la instancia de EuiccManager y llamar a los métodos en EuiccManager para obtener la información eUICC y administrar las suscripciones (denominadas perfiles en los documentos GSMA RSP) como instancias de SubscriptionInfo.

Para llamar a las API públicas, incluidas las operaciones de descarga, cambio y eliminación de suscripción, la aplicación del operador debe tener los privilegios necesarios. Los privilegios de operador son agregados por el operador de telefonía móvil en los metadatos del perfil. La API eUICC hace cumplir las reglas de privilegio del operador en consecuencia.

La plataforma Android no maneja las reglas de la política de perfil. Si se declara una regla de política en los metadatos del perfil, la LPA puede elegir cómo manejar el procedimiento de descarga e instalación del perfil. Por ejemplo, es posible que una LPA de OEM de terceros maneje las reglas de la política utilizando un código de error especial (el código de error se pasa de la LPA de OEM a la plataforma, luego la plataforma pasa el código a la LUI de OEM).

API

Las siguientes API se pueden encontrar en el EuiccManager documentación de referencia y EuiccManager.java .

Obtener instancia (pública)

Obtiene la instancia de EuiccManager través de Context#getSystemService .

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

Verificar habilitado (público)

Comprueba si la suscripción integrada está habilitada. Esto debe comprobarse antes de acceder a las API de LPA.

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

Obtener EID (público)

Obtiene el EID que identifica el hardware eUICC. Esto puede ser nulo si la eUICC no está lista. La persona que llama debe tener privilegios de operador o el permiso READ_PRIVILEGED_PHONE_STATE .

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

Obtener EuiccInfo (público)

Obtiene información sobre la eUICC. Contiene la versión del sistema operativo.

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

Descarga de suscripción (pública)

Descarga la suscripción dada (denominada "perfil" en los documentos GSMA RSP). La suscripción se puede crear a partir de un código de activación. Por ejemplo, un código de activación se puede analizar a partir de un código QR. La descarga de una suscripción es una operación asincrónica.

La persona que llama debe tener el permiso WRITE_EMBEDDED_SUBSCRIPTIONS o tener privilegios de operador para la suscripción de destino.

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

Cambiar suscripción (pública)

Cambia a (habilita) la suscripción dada. La persona que llama debe tener WRITE_EMBEDDED_SUBSCRIPTIONS o tener privilegios de operador para la suscripción habilitada actual y la suscripción de destino.

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

Eliminar suscripción (pública)

Elimina una suscripción con un ID de suscripción. Si la suscripción está actualmente activa, primero se deshabilita. La persona que llama debe tener WRITE_EMBEDDED_SUBSCRIPTIONS o privilegios de operador para la suscripción de destino.

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

Borrar todas las suscripciones (API del sistema)

Borra todas las suscripciones de un dispositivo. A partir de Android 11, debe proporcionar un valor de enumeración EuiccCardManager#ResetOption para especificar si desea borrar todos los tipos de suscripciones de prueba, operativas o ambos. La persona que llama debe tener el permiso 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);

Iniciar actividad de resolución (público)

Inicia una actividad para resolver un error que puede resolver el usuario. Si una operación devuelve EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR , se puede llamar a este método para solicitar al usuario que resuelva el problema. Este método solo se puede llamar una vez para un error en particular.

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

Constantes

Para ver una lista de las constantes public en EuiccManager , consulte Constantes .