Android キャプチャ
Custom Tab でキャプチャを開き、本人をアプリに戻します。
バックエンドは、Journey フローと、アプリの URL スキームを使った callbackUri を指定して、Human Plugin でプロセスを作成します。アプリは、レスポンスに含まれる link を Custom Tab で開きます。キャプチャが終了すると、ブラウザがお客様のスキームを開き、アプリに制御が戻ります。
作成レスポンスに含まれる Human Plugin の id を保存しておいてください。バックエンドはこの id で結果を読み取ります。
前提条件
- Android 8(API 26)以降
androidx.browser:browser:1.5.0myappのような、アプリ固有の URL スキーム
1. 依存関係を追加する
build.gradle に追加します。
implementation("androidx.browser:browser:1.5.0")
2. スキームを指定してプロセスを作成する
バックエンドは、スキームを callbackUri として送信します。
{
"flow": "humantoken",
"clientId": "client-a",
"correlationId": "order-1001",
"credential": { "type": "DUI_TYPE_NG_BVN", "value": "<document number>" },
"callbackUri": "myapp://callback"
}
そして、id と link をアプリに返します。
3. アクティビティを作成する
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") {
// キャプチャが終了しました。Human Plugin の id を使い、
// GET /v1/processes/{id} で結果を読み取るようバックエンドに依頼します。
onCaptureEnded(processId)
}
}
private fun onCaptureEnded(processId: String?) {
finish()
}
companion object {
const val EXTRA_PROCESS_ID = "process_id"
const val EXTRA_LINK = "link"
}
}
4. 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 を指定すると、Android は同じアクティビティの onNewIntent() に戻り先を渡します。
5. キャプチャを開始する
val intent = Intent(this, CaptureActivity::class.java)
.putExtra(CaptureActivity.EXTRA_PROCESS_ID, id)
.putExtra(CaptureActivity.EXTRA_LINK, link)
startActivity(intent)
まとめ
| ファイル | 目的 |
|---|---|
build.gradle | androidx.browser の依存関係 |
CaptureActivity.kt | Custom Tab を開き、戻り先を処理する |
AndroidManifest.xml | お客様のスキーム用のインテントフィルター |
WebView を使う場合
警告
Custom Tabs の使用をおすすめします。WebView は、Custom Tabs を利用できない場合にのみ使用してください。
キャプチャには、JavaScript、DOM ストレージ、メディアの自動再生、そしてカメラと位置情報の権限が必要です。
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)
}
}
AndroidManifest.xml に権限を宣言し、link を読み込む前に、実行時にカメラと位置情報の権限を要求してください。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
WebView では、link を直接開いてください。その中で Journeys SDK を読み込まないでください。