Saltar al contenido principal
Captura en Android

Abra la captura en un Custom Tab y devuelva a la persona a su app.

Markdown

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​

ArchivoPropósito
build.gradleDependencia androidx.browser
CaptureActivity.ktAbre el Custom Tab y gestiona el retorno
AndroidManifest.xmlIntent filter para su esquema

Uso de un WebView​

advertencia

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.