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 gestión de perfiles (públicos y @SystemApi) están disponibles a través de la clase EuiccManager . API de comunicación eUICC (@SystemApi solamente) 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. Un LPA aplicación (LUI y LPA backend) necesita ser una aplicación del sistema (es decir, incluida la imagen del sistema en) para llamar al @SystemApi.

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

Figura 1. Los teléfonos Android con la aplicación de soporte y OEM LPA

Además de la lógica de llamar EuiccCardManager y hablar con eUICC, aplicaciones LPA deben implementar la 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

A pesar de que más de una aplicación LPA puede estar presente en un teléfono Android, sólo una LPA puede ser seleccionado para ser el LPA real de trabajo basado en la prioridad definida en el AndroidManifest.xml de archivo de cada aplicación.

Usando EuiccManager

Las API de LPA son públicos a través EuiccManager (bajo paquete android.telephony.euicc ). Una aplicación de soporte puede obtener la instancia de EuiccManager , y llamar a los métodos en EuiccManager para obtener la información eUICC y gestionar las suscripciones (denominados perfiles en documentos GSMA RSP) como instancias 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 aplica 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 un OEM LPA de terceros maneje las reglas de política utilizando un código de error especial (el código de error se pasa del OEM LPA a la plataforma, luego la plataforma pasa el código al OEM LUI).

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 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 soporte o la READ_PRIVILEGED_PHONE_STATE permiso.

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 WRITE_EMBEDDED_SUBSCRIPTIONS permiso o tener privilegios de soporte 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 ya sea WRITE_EMBEDDED_SUBSCRIPTIONS o tener privilegios de soporte para la corriente activada suscripción 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 ya sea WRITE_EMBEDDED_SUBSCRIPTIONS o privilegios de soporte 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, se debe proporcionar un EuiccCardManager#ResetOption valor de enumeración para especificar si desea borrar todas las pruebas, operacional, o ambos tipos de suscripciones. La persona que llama debe tener WRITE_EMBEDDED_SUBSCRIPTIONS permiso.

// 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 regresa EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR , este método se puede llamar para pedir al usuario para resolver el problema. Este método solo se puede llamar una vez para un error particular.

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

Constantes

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