Abra la captura en un Custom Tab y devuelva a la persona a su app.
Su back-end crea el proceso en Human Plugin con un flujo Journey y un callbackUri que usa el esquema de URL de su app. La app abre el link de la respuesta en un Custom Tab. Cuando termina la captura, el navegador abre su esquema y la app retoma el control.
Conserve el id de Human Plugin de la respuesta de creación. Su back-end lee el resultado con él.
Requisitos previos
- Android 8 (API 26) o superior
androidx.browser:browser:1.5.0- Un esquema de URL exclusivo de su app, como
myapp
1. Agregue la dependencia
En build.gradle:
implementation("androidx.browser:browser:1.5.0")
2. Cree el proceso con su esquema
Su back-end envía el esquema como callbackUri:
{
"flow": "humantoken",
"clientId": "client-a",
"correlationId": "order-1001",
"credential": { "type": "DUI_TYPE_NG_BVN", "value": "<document number>" },
"callbackUri": "myapp://callback"
}
y devuelve id y link a la app.
3. Cree la activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.browser.customtabs.CustomTabsIntent
class CaptureActivity : AppCompatActivity() {
private var processId: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
processId = intent.getStringExtra(EXTRA_PROCESS_ID)
val link = intent.getStringExtra(EXTRA_LINK) ?: return finish()
CustomTabsIntent.Builder()
.build()
.launchUrl(this, Uri.parse(link))
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.data?.scheme == "myapp") {
// La captura terminó. Pida a su back-end que lea el resultado
// con GET /v1/processes/{id}, usando el id de Human Plugin.
onCaptureEnded(processId)
}
}
private fun onCaptureEnded(processId: String?) {
finish()
}
companion object {
const val EXTRA_PROCESS_ID = "process_id"
const val EXTRA_LINK = "link"
}
}
4. Registre el esquema en AndroidManifest.xml
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<activity
android:name=".CaptureActivity"
android:launchMode="singleTop"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="callback" />
</intent-filter>
</activity>
singleTop hace que Android entregue el retorno a onNewIntent() de la misma activity.
5. Inicie la captura
val intent = Intent(this, CaptureActivity::class.java)
.putExtra(CaptureActivity.EXTRA_PROCESS_ID, id)
.putExtra(CaptureActivity.EXTRA_LINK, link)
startActivity(intent)
Resumen
| Archivo | Propósito |
|---|---|
build.gradle | Dependencia androidx.browser |
CaptureActivity.kt | Abre el Custom Tab y gestiona el retorno |
AndroidManifest.xml | Intent filter para su esquema |
Uso de un WebView
Prefiera Custom Tabs. Use un WebView solo si Custom Tabs no es una opción.
La captura necesita JavaScript, DOM storage, reproducción automática de medios y los permisos de cámara y ubicación:
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.settings.setGeolocationEnabled(true)
webView.webChromeClient = object : WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (PermissionRequest.RESOURCE_VIDEO_CAPTURE in request.resources) {
request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
} else {
request.deny()
}
}
override fun onGeolocationPermissionsShowPrompt(
origin: String,
callback: GeolocationPermissions.Callback
) {
callback.invoke(origin, true, false)
}
}
Declare los permisos en AndroidManifest.xml y solicite cámara y ubicación en tiempo de ejecución antes de cargar el link:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
En un WebView, abra el link directamente. No cargue el SDK de Journeys dentro de él.