Pular para o conteúdo principal

Android nativo (Kotlin)

Integre o FaceGuard em aplicações Android nativas usando WebView.

Configuração

Adicione a permissão de câmara ao AndroidManifest.xml:

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

Implementação

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
}

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

// Ouvir 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")

// Injetar script de bridge
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 acesso */ }
fun handleRejected(confidence: Double) { /* Negar acesso */ }
fun handleCanceled() { /* Utilizador fechou */ }
fun handleError(message: String) { /* Mostrar erro */ }
}

Como funciona o bridge

O WebView Android não recebe nativamente eventos postMessage. O método @JavascriptInterface e o script de bridge injetado reencaminham os eventos do iframe do FaceGuard para o código Kotlin nativo.

Permissão de câmara

Tanto a permissão no manifesto (CAMERA) como o handler onPermissionRequest são obrigatórios. O manifesto declara a permissão e o handler concede-a ao WebView em tempo de execução.