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.