Rendimiento y lector listo
Requiere FINORA Pago 0.16.0 y el SDK 1.0.0-beta.3. Las cifras de esta página son las medidas el 2026-10-21 en un teléfono real con lector Bluetooth y FINORA Pago 0.15.3, antes del lector precalentado. La medición en caliente con la 0.16.0 en el mismo equipo está en curso; esta página se actualizará con sus cifras.
Dónde se va el tiempo
En un teléfono con lector de tarjetas por Bluetooth, el tramo lento no es la red ni la autorización: es conectar el lector y dejarlo listo. Medido el 2026-10-21 (teléfono Android de gama media, lector Bluetooth, FINORA Pago 0.15.3):
| Tramo | Primer cobro (lector frío) | Cobro con el lector ya conectado |
|---|---|---|
| Conexión Bluetooth del lector | ≈ 2,3 s | 0 s |
| Lector listo para leer (tablas EMV) | ≈ 8 s más | Inmediato |
| Autorización ida y vuelta | ≈ 0,5 s | ≈ 0,5 s |
Antes de la 0.16.0, cada conexión volvía a escribir las tablas EMV en el lector. Desde la 0.16.0, FINORA Pago recuerda qué tablas tiene cada lector y al reconectar solo las confirma (una consulta); las escribe de nuevo únicamente si cambiaron. La primera conexión de cada lector tras instalar la 0.16.0 todavía las escribe una vez.
Prepara el lector antes del cobro
Llama a FinoraPago.prepararLector(context) en cuanto sepas que viene un cobro: al abrir el pedido, al llegar a la entrega, al mostrar el total. FINORA Pago conecta el lector y confirma sus tablas en segundo plano y sin efectos de cobro: no abre pantalla, no crea órdenes, no lee tarjetas.
// Al abrir la pantalla del pedido, fuera del hilo principal:
lifecycleScope.launch {
val e = withContext(Dispatchers.IO) { FinoraPago.prepararLector(context) }
if (e.lectorEstado == Contrato.EstadoLector.ERROR) avisar(e.motivo) // p. ej., lector apagado
}
La llamada vuelve enseguida con el estado de ese momento; la preparación sigue en FINORA Pago. Si quieres esperarla (por ejemplo, para habilitar el botón «Cobrar» con el lector listo), vuelve a mirar FinoraPago.estado(context) cada medio segundo hasta lectorListo, con un tope:
var e = FinoraPago.prepararLector(context)
val inicio = SystemClock.elapsedRealtime()
while (!e.lectorListo && e.lectorEstado != null && e.lectorEstado != Contrato.EstadoLector.ERROR &&
SystemClock.elapsedRealtime() - inicio < 30_000) {
delay(500)
e = FinoraPago.estado(context)
}
No es obligatorio esperar. lectorListo no condiciona listo: con el lector frío FINORA Pago cobra igual, solo tarda más. Y si el cobro llega mientras el lector se prepara, espera a esa preparación y la encuentra hecha.
Estado del lector
lectorEstado | Significado |
|---|---|
LISTO | Conectado y con las tablas confirmadas: el cobro empieza sin esperar al lector (lectorListo = true) |
CONECTANDO / PREPARANDO | FINORA Pago lo está dejando listo |
DESCONECTADO | Sin enlace: se conectará al preparar o al cobrar |
ERROR | No se pudo conectar (apagado, fuera de alcance, sin vincular). motivo lo explica |
NO_APLICA | El equipo tiene un lector interno o simulado: siempre listo para esto |
null | FINORA Pago anterior a 0.16.0, que no lo informa |
Con un FINORA Pago anterior a 0.16.0, prepararLector devuelve lo mismo que estado() y no prepara nada: tu app no se rompe, el lector se conecta al cobrar como siempre.
prepararLector solo surte efecto para apps autorizadas por el comercio (ver Seguridad y alta); a las demás FINORA Pago no les prepara nada. Tampoco toca nunca un cobro en curso.
Cuánto tiempo se mantiene listo
FINORA Pago también prepara el lector por su cuenta cuando se abre, cuando llega una orden y cuando tu app consulta estado(). Mientras haya actividad reciente, lo mantiene conectado: cada 30 segundos comprueba el enlace y lo reconecta si se cayó. Pasados 15 minutos sin actividad suelta el enlace para ahorrar batería del teléfono y del lector.
El comercio puede cambiar esa ventana para cada terminal en su consola (parámetro «Lector listo (minutos)», de 0 a 240; 0 apaga el precalentado y el lector se conecta al cobrar).
Mide tus cobros
Desde la 0.16.0, FINORA Pago escribe en el registro del sistema (etiqueta FinoraTiempos) una línea por tramo de cada cobro y un resumen al cerrarlo. No contiene datos de la tarjeta ni del cliente: solo la referencia de la orden, el tramo, los milisegundos y si el lector estaba frío o caliente.
I/FinoraTiempos: id=3 ref=FNR123 origen=SDK tramo=LECTOR_LISTO t=<ms> d=<ms> arranque=CALIENTE
I/FinoraTiempos: resumen id=3 ref=FNR123 origen=SDK arranque=CALIENTE desenlace=Aprobado total=<ms> marcas=SOLICITUD:0,…
| Tramo | Qué marca |
|---|---|
SOLICITUD | Llegó tu petición |
ESPERANDO_TARJETA | La pantalla pide la tarjeta |
LECTOR_LISTO | El lector está listo (arranque=FRIO si hubo que conectarlo, CALIENTE si estaba preparado) |
TARJETA_PRESENTADA / DATOS_LEIDOS | El cliente presentó la tarjeta / la lectura terminó |
ENVIO_AUTORIZACION / VEREDICTO | Sale la autorización / llega la respuesta |
FIRMA / RECIBO | Firma (solo si aplica) / recibo en pantalla |
RESPUESTA_INTEGRADOR | Tu app ya tiene el resultado |
t son los milisegundos desde la solicitud y d desde la marca anterior. Con el equipo conectado por USB puedes leerlo con adb logcat -s FinoraTiempos.