autentikar
Personalización

Core

Configura colores, tipografía, carga y pantallas de instrucciones iOS personalizadas en Autentikar SDK Core.

Tema visual compartido

AutentikarCoreCustomization define el lenguaje visual base utilizado por los flujos primarios de SDK. Sus configuraciones de componentes cubren:

  • Title
  • Text
  • Caption
  • FooterText
  • Button
  • Confirm
  • Instructions
  • LoadingView

Aplica esta configuración una vez a través de AutentikarManager; los módulos que heredan el estilo Core utilizan la misma base visual.

iOS

Aplicar la personalización

AutentikarConfiguration.swift
let custom = AutentikarCoreCustomization()
custom.backgroundColor = .black
custom.title.color = .white
custom.button.activeColor = .blue

AutentikarManager.shared.setCustomization(custom)

Configura el objeto antes de iniciar un flujo de Autentikar. Puedes modificar únicamente las propiedades que requiera tu diseño; las demás conservarán sus valores predeterminados.

Referencia de propiedades

Apariencia general y contenido

PropiedadTipoValor predeterminadoFunción
backgroundColorUIColor.whiteFondo compartido por las pantallas de Core.
animationColor[UIColor][#082C4C]Colores utilizados por la animación de procesamiento.
logoNameString"Autentikar"Nombre del recurso de imagen cargado desde el bundle configurado.
showLogoBooltrueMuestra u oculta el logotipo en las pantallas generales de Core. El consentimiento usa confirm.showLogo.
showFooterClaimsBooltrueMuestra u oculta los mensajes rotativos del pie de página.
loadingViewAutentikarLoadingProvider?nilReemplaza la interfaz de carga estándar.

Tipografía

PropiedadTipoValor predeterminadoFunción
title.fontUIFontPlus Jakarta Sans SemiBold, 18 ptFuente de los títulos de pantalla.
title.colorUIColor#3A3A3CColor de los títulos.
text.fontUIFontPlus Jakarta Sans Regular, 16 ptFuente del texto general.
text.fontBoldUIFontPlus Jakarta Sans SemiBold, 16 ptFuente en negrita del texto atribuido.
text.colorUIColor#3A3A3CColor del texto general.
caption.fontUIFontPlus Jakarta Sans Light, 16 ptFuente de los textos secundarios.
caption.colorUIColor#3A3A3CColor de los textos secundarios.
footerText.fontUIFontPlus Jakarta Sans Regular, 16 ptFuente de los mensajes rotativos del pie de página.
footerText.colorUIColor#3A3A3CColor de los mensajes del pie de página.
footerText.claims[String]Cinco mensajes localizados de CoreMensajes que aparecen de forma rotativa en el pie de página.

Botones

PropiedadTipoValor predeterminadoFunción
button.fontUIFontPlus Jakarta Sans Regular, 16 ptFuente del texto de los botones.
button.activeTextColorUIColor.whiteColor del texto de los botones principales habilitados.
button.activeColorUIColor#082C4CColor de fondo de los botones principales habilitados.
button.disableTextColorUIColor.whiteColor del texto de los botones deshabilitados.
button.disabledColorUIColor#5F6368Color de fondo de los botones deshabilitados.
button.cornerRadiusCGFloat10Radio de las esquinas de los botones estándar en puntos.
button.outlineColorUIColor#082C4CColor del borde y del texto de los botones con contorno.

Controles de confirmación

PropiedadTipoValor predeterminadoFunción
confirm.toggleColorOnUIColor#082C4CColor del interruptor en estado activo.
confirm.toggleColorOffUIColor#5F6368Color del interruptor en estado inactivo.
confirm.linkTextColorUIColor#082C4CColor de los enlaces del contenido de confirmación.
confirm.showLogoBooltrueMuestra u oculta el logotipo únicamente en la pantalla de consentimiento. Disponible desde Core 1.0.15.
Al migrar a 1.0.15, si utilizabas showLogo = false para ocultar el logotipo en todo el flujo, configura también confirm.showLogo = false.

Pantallas de instrucciones estándar

Estos colores se aplican a las pantallas estándar de instrucciones de documento y prueba de vida. Desde Core 1.0.15, esas pantallas ya no muestran un botón de cierre. Las propiedades de provider reemplazan por completo esas pantallas y se explican en Pantallas de instrucciones personalizadas.

PropiedadTipoValor predeterminadoFunción
instructions.iconColorUIColor#082C4CColor de los íconos de cada instrucción.
instructions.closeIconColorUIColor#082C4CPropiedad conservada por compatibilidad; las pantallas estándar ya no muestran el ícono de cierre desde 1.0.15.
instructions.photoIDScanViewProviderAutentikarInstructionViewProvider?nilReemplaza la pantalla de instrucciones de documento.
instructions.livenessCheckViewProviderAutentikarInstructionViewProvider?nilReemplaza la pantalla de instrucciones de prueba de vida.

Imagen remota en instrucciones iOS

Desde Core 1.0.15, las pantallas estándar de instrucciones de documento y prueba de vida pueden mostrar la imagen remota que el paso activo entrega mediante header_image. Esta configuración proviene del servidor; no es necesario asignarla en AutentikarCoreCustomization.

Respuesta del paso
{
  "header_image": {
    "alt": "header",
    "src": "https://example.com/instructions.png",
    "type": "image/png"
  }
}

Cuando alt es header y src contiene una imagen válida, la imagen reemplaza el título, la descripción y la lista de instrucciones estándar. El botón para continuar permanece visible. Si la imagen no está disponible o no se puede cargar, el SDK recupera automáticamente el contenido estándar.

Un photoIDScanViewProvider o livenessCheckViewProvider configurado tiene prioridad y reemplaza toda la pantalla estándar. Core no inserta header_image dentro de una vista personalizada; la aplicación controla por completo su contenido.

Ejemplo visual completo

CoreCustomization.swift
import AutentikarCore
import UIKit

let custom = AutentikarCoreCustomization()

custom.backgroundColor = .systemBackground
custom.animationColor = [.systemCyan, .systemBlue]
custom.logoName = "CompanyLogo"
custom.showLogo = true
custom.showFooterClaims = true

custom.title.font = .boldSystemFont(ofSize: 20)
custom.title.color = .label
custom.text.font = .systemFont(ofSize: 16)
custom.text.fontBold = .boldSystemFont(ofSize: 16)
custom.text.color = .label
custom.caption.font = .systemFont(ofSize: 14)
custom.caption.color = .secondaryLabel

custom.footerText.font = .systemFont(ofSize: 14)
custom.footerText.color = .secondaryLabel
custom.footerText.claims = [
    "Tu información está protegida.",
    "Este proceso solo tomará un momento."
]

custom.button.font = .boldSystemFont(ofSize: 16)
custom.button.activeTextColor = .white
custom.button.activeColor = .systemBlue
custom.button.disableTextColor = .tertiaryLabel
custom.button.disabledColor = .systemGray5
custom.button.cornerRadius = 24
custom.button.outlineColor = .systemBlue

custom.confirm.toggleColorOn = .systemBlue
custom.confirm.toggleColorOff = .systemGray
custom.confirm.linkTextColor = .systemBlue
custom.confirm.showLogo = true

custom.instructions.iconColor = .systemBlue

AutentikarManager.shared.setCustomization(custom)

Vista de carga personalizada

A partir de Core 1.0.11, loadingView acepta un proveedor SwiftUI o UIKit.

AutentikarConfiguration.swift
// SwiftUI
let custom = AutentikarCoreCustomization()
custom.loadingView = AutentikarSwiftUILoadingProvider {
    ProgressView()
        .tint(.blue)
        .scaleEffect(2)
}

AutentikarManager.shared.setCustomization(custom)
AutentikarConfiguration.swift
// UIKit
let custom = AutentikarCoreCustomization()
let spinner = UIActivityIndicatorView(style: .large)
spinner.startAnimating()
spinner.color = .red

custom.loadingView = AutentikarUIKitLoadingProvider(view: spinner)
AutentikarManager.shared.setCustomization(custom)

Pantallas de instrucciones personalizadas

A partir de Core 1.0.14, puedes reemplazar por completo la pantalla de instrucciones que aparece antes de la captura del documento o de la prueba de vida. El SDK admite implementaciones en SwiftUI, UIView, UIViewController y Objective-C.

PantallaPropiedad de configuración
Captura de documentocustom.instructions.photoIDScanViewProvider
Prueba de vidacustom.instructions.livenessCheckViewProvider

Cada provider recibe un objeto AutentikarInstructionActions. Conecta los controles de tu interfaz con estas acciones para que el SDK mantenga el control del flujo:

  • actions.agree() cierra las instrucciones e inicia el paso de captura correspondiente.
  • actions.dismiss() cierra las instrucciones sin iniciar el paso de captura.
La factory del provider se ejecuta cada vez que se presenta la pantalla de instrucciones. Devuelve siempre una vista o un controlador nuevo. Si un provider es nil, el SDK muestra su pantalla de instrucciones estándar; por lo tanto, puedes personalizar cada pantalla de forma independiente.

Selecciona la implementación que corresponda a la tecnología de interfaz de tu aplicación:

import AutentikarCore
import SwiftUI

struct BrandedInstructionView: View {
    let title: String
    let actions: AutentikarInstructionActions

    var body: some View {
        VStack(spacing: 24) {
            Text(title)
                .font(.title.bold())

            Text("Sigue las indicaciones de tu organización.")
                .multilineTextAlignment(.center)

            Button("Continuar") {
                actions.agree()
            }
            .buttonStyle(.borderedProminent)

            Button("Cancelar", role: .cancel) {
                actions.dismiss()
            }
        }
        .padding(32)
    }
}

let custom = AutentikarCoreCustomization()

custom.instructions.photoIDScanViewProvider =
    AutentikarSwiftUIInstructionViewProvider { actions in
        BrandedInstructionView(
            title: "Fotografía tu documento",
            actions: actions
        )
    }

custom.instructions.livenessCheckViewProvider =
    AutentikarSwiftUIInstructionViewProvider { actions in
        BrandedInstructionView(
            title: "Centra tu rostro",
            actions: actions
        )
    }

AutentikarManager.shared.setCustomization(custom)

AutentikarSwiftUIInstructionViewProvider acepta cualquier View de SwiftUI. Para UIKit, usa AutentikarUIKitInstructionViewProvider con una vista o AutentikarInstructionControllerProvider cuando necesites que el SDK integre el ciclo de vida de un UIViewController.

Objective-C

Los providers de UIKit y los métodos de las acciones están expuestos a Objective-C. Importa la interfaz generada del framework y configura el provider antes de iniciar el flujo de Autentikar.

@import AutentikarCore;
@import UIKit;

AutentikarCoreCustomization *custom =
    [[AutentikarCoreCustomization alloc] init];

custom.instructions.photoIDScanViewProvider =
    [[AutentikarUIKitInstructionViewProvider alloc]
        initWithViewBuilder:^UIView *(
            AutentikarInstructionActions *actions
        ) {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
            [button setTitle:@"Continuar" forState:UIControlStateNormal];
            [button addAction:[UIAction actionWithHandler:^(__kindof UIAction *action) {
                [actions agree];
            }] forControlEvents:UIControlEventTouchUpInside];

            UIButton *cancel = [UIButton buttonWithType:UIButtonTypeSystem];
            [cancel setTitle:@"Cancelar" forState:UIControlStateNormal];
            [cancel addAction:[UIAction actionWithHandler:^(__kindof UIAction *action) {
                [actions dismiss];
            }] forControlEvents:UIControlEventTouchUpInside];

            UIStackView *stack = [[UIStackView alloc]
                initWithArrangedSubviews:@[button, cancel]];
            stack.axis = UILayoutConstraintAxisVertical;
            stack.spacing = 16;

            UIView *view = [[UIView alloc] init];
            view.backgroundColor = UIColor.systemBackgroundColor;
            stack.translatesAutoresizingMaskIntoConstraints = NO;
            [view addSubview:stack];
            [NSLayoutConstraint activateConstraints:@[
                [stack.leadingAnchor constraintEqualToAnchor:view.leadingAnchor
                                                    constant:32],
                [stack.trailingAnchor constraintEqualToAnchor:view.trailingAnchor
                                                     constant:-32],
                [stack.centerYAnchor constraintEqualToAnchor:view.centerYAnchor]
            ]];
            return view;
        }];

[[AutentikarManager shared] setCustomization:custom];

En la pestaña UIViewController, MyInstructionViewController debe crear una instancia nueva y conectar sus controles con las acciones recibidas.

Conserva el objeto actions en tu vista o controlador durante el tiempo que lo necesiten sus botones. No presentes el módulo de captura por tu cuenta: al llamar agree(), Autentikar continúa con el paso correcto de documento o prueba de vida.

Android

Aplicar la personalización

MainActivity.kt
import androidx.core.graphics.toColorInt

val custom = AutentikarCoreCustomization()
custom.backgroundColor = "#E84E1A".toColorInt()
custom.title.color = "#E84E1A".toColorInt()
custom.button.activeColor = "#E84E1A".toColorInt()

AutentikarManager.setCustomization(custom)

Configura el objeto antes de iniciar un flujo de Autentikar. En Android, los colores son valores @ColorInt, no identificadores de recursos. Resuelve un recurso de color con ContextCompat.getColor(...) o convierte un color hexadecimal con toColorInt().

Referencia de propiedades

Apariencia general

PropiedadTipoValor predeterminadoFunción
backgroundColorInt (@ColorInt)#FFFFFFFondo compartido por las pantallas de Core.
animationColorList<Int>[#082C4C, #082C4C]Colores utilizados por la animación de carga.
logoNameInt (@DrawableRes)R.drawable.autentikarRecurso drawable que se muestra como logotipo.
showLogoBooleantrueMuestra u oculta el logotipo en las pantallas generales de Core. El consentimiento usa confirm.showLogo.
loadingViewView?nullReemplaza la animación de carga estándar.

Tipografía

PropiedadTipoValor predeterminadoFunción
title.typefaceTypeface?nullFuente de los títulos; Core utiliza su fuente semibold incluida cuando no se configura.
title.colorInt (@ColorInt)#3A3A3CColor de los títulos.
text.typefaceTypeface?nullFuente del texto general; Core utiliza su fuente regular incluida cuando no se configura.
text.colorInt (@ColorInt)#3A3A3CColor del texto general.
caption.typefaceTypeface?nullFuente del texto secundario; Core utiliza su fuente light incluida cuando no se configura.
caption.colorInt (@ColorInt)Color.GRAYColor del texto secundario.
footerText.typefaceTypeface?nullFuente de los mensajes rotativos del pie de página.
footerText.colorInt (@ColorInt)#3A3A3CColor de los mensajes del pie de página.

Botones

PropiedadTipoValor predeterminadoFunción
button.typefaceTypeface?nullFuente de los botones; Core utiliza su fuente regular incluida cuando no se configura.
button.activeTextColorInt (@ColorInt)#FFFFFFColor del texto de los botones principales habilitados.
button.activeColorInt (@ColorInt)#082C4CColor de fondo de los botones principales habilitados.
button.disabledTextColorInt (@ColorInt)#FFFFFFColor del texto de los botones deshabilitados.
button.disabledColorInt (@ColorInt)#5F6368Color de fondo de los botones deshabilitados.
button.cornerRadiusFloat20FRadio de las esquinas de los botones en píxeles.
button.outlineColorInt (@ColorInt)#082C4CColor del texto de los botones con contorno.

Controles de confirmación

PropiedadTipoValor predeterminadoFunción
confirm.checkBoxColorInt (@ColorInt)#082C4CColor aplicado al checkbox de consentimiento.
confirm.linkTextColorInt (@ColorInt)#082C4CColor de los enlaces del contenido de consentimiento.
confirm.showLogoBooleantrueMuestra u oculta el logotipo únicamente en la pantalla de consentimiento. Disponible desde Core 1.0.20.
Al migrar a 1.0.20, si utilizabas showLogo = false para ocultar el logotipo en todo el flujo, configura también confirm.showLogo = false.

Pantallas de instrucciones estándar

Las propiedades de color modifican los layouts XML estándar de instrucciones. Desde Core 1.0.20, esos layouts ya no muestran un botón de cierre. Las propiedades de provider reemplazan por completo esos layouts y se explican en Pantallas de instrucciones Android personalizadas.

PropiedadTipoValor predeterminadoFunción
instructions.iconColorInt (@ColorInt)#082C4CColor aplicado a los íconos de cada instrucción.
instructions.closeIconColorInt (@ColorInt)#082C4CPropiedad conservada por compatibilidad; las pantallas estándar ya no muestran el ícono de cierre desde 1.0.20.
instructions.photoIDScanViewProviderAutentikarInstructionViewProvider?nullReemplaza la pantalla de instrucciones de documento.
instructions.livenessCheckViewProviderAutentikarInstructionViewProvider?nullReemplaza la pantalla de instrucciones de prueba de vida.

Imagen remota en instrucciones Android

Desde Core 1.0.20, los layouts estándar de instrucciones de documento y prueba de vida pueden mostrar la imagen remota que el paso activo entrega mediante header_image. Esta configuración proviene del servidor; no es necesario asignarla en AutentikarCoreCustomization.

Respuesta del paso
{
  "header_image": {
    "alt": "header",
    "src": "https://example.com/instructions.png",
    "type": "image/png"
  }
}

Cuando alt es header y src contiene una imagen válida, la imagen reemplaza el título, la descripción y la lista de instrucciones estándar. El botón para continuar permanece visible. Si la imagen no está disponible o no se puede cargar, el SDK recupera automáticamente el contenido estándar.

Un photoIDScanViewProvider o livenessCheckViewProvider configurado tiene prioridad y reemplaza todo el layout estándar. Core no inserta header_image dentro de una vista personalizada; la aplicación controla por completo su contenido.

Ejemplo visual completo

MainActivity.kt
import android.graphics.Color
import android.graphics.Typeface
import androidx.core.graphics.toColorInt

val custom = AutentikarCoreCustomization().apply {
    backgroundColor = "#F8FAFC".toColorInt()
    animationColor = listOf(
        "#2563EB".toColorInt(),
        "#06B6D4".toColorInt()
    )
    logoName = R.drawable.company_logo
    showLogo = true

    title.typeface = Typeface.DEFAULT_BOLD
    title.color = "#0F172A".toColorInt()
    text.typeface = Typeface.DEFAULT
    text.color = "#334155".toColorInt()
    caption.typeface = Typeface.DEFAULT
    caption.color = "#64748B".toColorInt()
    footerText.typeface = Typeface.DEFAULT
    footerText.color = "#64748B".toColorInt()

    button.typeface = Typeface.DEFAULT_BOLD
    button.activeTextColor = Color.WHITE
    button.activeColor = "#2563EB".toColorInt()
    button.disabledTextColor = "#94A3B8".toColorInt()
    button.disabledColor = "#E2E8F0".toColorInt()
    button.cornerRadius = 24F
    button.outlineColor = "#2563EB".toColorInt()

    confirm.checkBoxColor = "#2563EB".toColorInt()
    confirm.linkTextColor = "#2563EB".toColorInt()
    confirm.showLogo = true

    instructions.iconColor = "#2563EB".toColorInt()
}

AutentikarManager.setCustomization(custom)

Vista de carga personalizada

Desde Core 1.0.15, loadingView acepta un View de Android.

MainActivity.kt
import android.content.res.ColorStateList
import android.graphics.Color
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    // Conserva una referencia fuerte mientras Autentikar pueda usar la vista.
    private val customLoadingView by lazy {
        ProgressBar(this).apply {
            isIndeterminate = true
            indeterminateTintList =
                ColorStateList.valueOf(Color.RED)
        }
    }

    private fun configureAutentikar() {
        val custom = AutentikarCoreCustomization()
        custom.loadingView = customLoadingView
        AutentikarManager.setCustomization(custom)
    }
}
Core conserva loadingView mediante una referencia débil. Mantén una referencia fuerte en tu activity, fragment u otro propietario mientras el SDK pueda mostrarla. El SDK retira la vista de su parent anterior antes de añadirla al contenedor de carga.

Pantallas de instrucciones Android personalizadas

A partir de Core 1.0.19, configura un AutentikarInstructionViewProvider para reemplazar cualquiera de las pantallas de instrucciones con un View de Android. Cada provider es independiente: puedes personalizar solo una pantalla o las dos.

PantallaPropiedad de configuración
Captura de documentocustom.instructions.photoIDScanViewProvider
Prueba de vidacustom.instructions.livenessCheckViewProvider

El método createView del provider recibe estos valores:

ParámetroUso
inflaterLayoutInflater que puedes usar para inflar un layout XML.
parentContenedor donde Core presentará la vista. Pásalo como root al inflar, con attachToRoot = false.
actionsAcciones que devuelven el control del flujo al SDK.

La vista debe llamar una de estas acciones:

  • actions.agree() cierra las instrucciones y continúa con la captura de documento o la prueba de vida.
  • actions.dismiss() cierra las instrucciones sin iniciar el paso de captura.

Layout XML reutilizable

Puedes usar el mismo layout para ambas pantallas y cambiar su contenido desde cada provider:

res/layout/view_custom_instructions.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="24dp">

    <TextView
        android:id="@+id/instructionTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/continueButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="@string/continue_action" />

    <Button
        android:id="@+id/closeButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/cancel_action" />
</LinearLayout>

Agrega también los textos usados por el ejemplo:

res/values/strings.xml
<resources>
    <string name="photo_id_instructions_title">Prepara tu documento de identidad</string>
    <string name="liveness_instructions_title">Prepara la prueba de vida</string>
    <string name="continue_action">Continuar</string>
    <string name="cancel_action">Cancelar</string>
</resources>

Configurar ambos providers con Kotlin

Este helper crea una vista nueva en cada presentación y conecta los botones con el flujo administrado por Core:

MainActivity.kt
import android.view.View
import android.widget.TextView
import androidx.annotation.StringRes
import com.autentikar.core_v2.common.managers.AutentikarManager
import com.autentikar.core_v2.common.views.AutentikarInstructionViewProvider
import com.autentikar.core_v2.utilities.customizations.AutentikarCoreCustomization

private fun instructionProvider(
    @StringRes titleRes: Int
) = AutentikarInstructionViewProvider { inflater, parent, actions ->
    inflater.inflate(
        R.layout.view_custom_instructions,
        parent,
        false
    ).apply {
        findViewById<TextView>(R.id.instructionTitle).setText(titleRes)

        findViewById<View>(R.id.continueButton)
            .setOnClickListener { actions.agree() }

        findViewById<View>(R.id.closeButton)
            .setOnClickListener { actions.dismiss() }
    }
}

val custom = AutentikarCoreCustomization()

custom.instructions.photoIDScanViewProvider =
    instructionProvider(R.string.photo_id_instructions_title)

custom.instructions.livenessCheckViewProvider =
    instructionProvider(R.string.liveness_instructions_title)

AutentikarManager.setCustomization(custom)

Si solo necesitas personalizar una de las pantallas, asigna únicamente su provider. La otra seguirá usando el diseño estándar.

Crear la vista por código

No es obligatorio usar XML. El provider también puede construir y devolver una jerarquía de vistas nueva:

MainActivity.kt
import android.view.Gravity
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import com.autentikar.core_v2.common.views.AutentikarInstructionViewProvider

custom.instructions.livenessCheckViewProvider =
    AutentikarInstructionViewProvider { _, parent, actions ->
        val padding = (24 * parent.resources.displayMetrics.density).toInt()

        LinearLayout(parent.context).apply {
            orientation = LinearLayout.VERTICAL
            gravity = Gravity.CENTER
            setPadding(padding, padding, padding, padding)

            addView(TextView(context).apply {
                text = context.getString(R.string.liveness_instructions_title)
            })

            addView(Button(context).apply {
                text = context.getString(R.string.continue_action)
                setOnClickListener { actions.agree() }
            })

            addView(Button(context).apply {
                text = context.getString(R.string.cancel_action)
                setOnClickListener { actions.dismiss() }
            })
        }
    }

Configurar un provider desde Java

Las propiedades exponen getters y setters compatibles con Java. El mismo patrón funciona con setLivenessCheckViewProvider.

MainActivity.java
import android.view.View;

import com.autentikar.core_v2.common.managers.AutentikarManager;
import com.autentikar.core_v2.utilities.customizations.AutentikarCoreCustomization;

AutentikarCoreCustomization custom = new AutentikarCoreCustomization();

custom.getInstructions().setPhotoIDScanViewProvider(
    (inflater, parent, actions) -> {
        View view = inflater.inflate(
            R.layout.view_custom_instructions,
            parent,
            false
        );

        view.findViewById(R.id.continueButton)
            .setOnClickListener(button -> actions.agree());

        view.findViewById(R.id.closeButton)
            .setOnClickListener(button -> actions.dismiss());

        return view;
    }
);

AutentikarManager.setCustomization(custom);
El provider se ejecuta cada vez que se presenta su pantalla de instrucciones, por lo que debe devolver una vista nueva. No añadas la vista manualmente a parent: Core se encarga de insertarla y retirarla. Si un provider es null, Core usa la pantalla estándar correspondiente. No inicies una actividad de captura desde la vista personalizada; usa agree() o dismiss() para que Autentikar controle el flujo activo.

Contenido localizado

La personalización visual y la personalización de texto son independientes. Utilice los archivos de localización de la plataforma para reemplazar la copia orientada al usuario sin cadenas de codificación dura en el objeto de personalización:

Copyright © 2026