Saltar al contenido principal

Android nativo (Kotlin)

Integra FaceGuard en aplicaciones Android nativas usando WebView.

Configuración

Añade el permiso de cámara a AndroidManifest.xml:

AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />

Implementación

FaceGuardActivity.kt
class FaceGuardActivity : AppCompatActivity() {

private lateinit var webView: WebView

fun startVerification(token: String) {
webView = findViewById(R.id.webview)

webView.settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
mediaPlaybackRequiresUserGesture = false
}

// Permiso de cámara
webView.webChromeClient = object : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.resources.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
request.grant(request.resources)
}
}
}

// Escuchar postMessage
webView.addJavascriptInterface(object {
@JavascriptInterface
fun onMessage(json: String) {
val data = JSONObject(json)
if (data.optString("action") == "close") {
val reason = data.optString("reason")
val confidence = data.optDouble("confidence", 0.0)
runOnUiThread {
when (reason) {
"approved", "bypass_active" -> handleApproved(confidence)
"rejected" -> handleRejected(confidence)
"canceled" -> handleCanceled()
"error", "no_base_photo" ->
handleError(data.optString("error", reason))
}
}
}
}
}, "SurtBridge")

// Inyectar script de puente
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
view.evaluateJavascript("""
window.addEventListener('message', function(e) {
if (e.data && (e.data.type === 'surt:ready' || e.data.action === 'close')) {
SurtBridge.onMessage(JSON.stringify(e.data));
}
});
""", null)
}
}

webView.loadUrl("https://faceguard.surt.com/intro?token=$token")
}

fun handleApproved(confidence: Double) { /* Conceder acceso */ }
fun handleRejected(confidence: Double) { /* Denegar acceso */ }
fun handleCanceled() { /* Usuario cerró */ }
fun handleError(message: String) { /* Mostrar error */ }
}

Cómo funciona el puente

El WebView de Android no recibe de forma nativa eventos postMessage. El método @JavascriptInterface y el script de puente inyectado reenvían los eventos del iframe de FaceGuard al código Kotlin nativo.

Permiso de cámara

Tanto el permiso en el manifiesto (CAMERA) como el manejador onPermissionRequest son necesarios. El manifiesto declara el permiso y el manejador lo concede al WebView en tiempo de ejecución.