Zum Hauptinhalt springen

Natives Android (Kotlin)

FaceGuard in native Android Apps mit WebView integrieren.

Setup

Kameraberechtigung zu AndroidManifest.xml hinzufügen:

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

Implementierung

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
}

// Kameraberechtigung
webView.webChromeClient = object : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.resources.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
request.grant(request.resources)
}
}
}

// postMessage abhören
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")

// Bridge-Script injizieren
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) { /* Zugriff gewähren */ }
fun handleRejected(confidence: Double) { /* Zugriff verweigern */ }
fun handleCanceled() { /* Nutzer hat geschlossen */ }
fun handleError(message: String) { /* Fehler anzeigen */ }
}

Wie die Bridge funktioniert

Android WebView empfängt postMessage-Events nicht nativ. Die @JavascriptInterface-Methode und das injizierte Bridge-Script leiten Events vom FaceGuard-iframe an nativen Kotlin-Code weiter.

Kameraberechtigung

Sowohl die Manifest-Berechtigung (CAMERA) als auch der onPermissionRequest-Handler sind erforderlich. Das Manifest deklariert die Berechtigung, der Handler gewährt sie dem WebView zur Laufzeit.