Android
Custom Tabsを使用してAndroidアプリにHuman Token Journeyを統合します。
Custom Tabsは、アプリ内のブラウザタブでHuman Token Journeyを起動します。ジャーニーが完了すると、ブラウザはカスタムURLスキームにリダイレクトし、アプリがそれをインターセプトします。
前提条件
- Android 8(API 26)以降
androidx.browser:browser:1.5.0- アプリ固有のURLスキーム(例:
myapp)
ステップ 1:依存関係を追加する
build.gradleに以下を追加:
implementation("androidx.browser:browser:1.5.0")
ステップ 2:URLスキームを定義する
一意のスキームを選択します(例:myapp)。プロセス作成時にcallbackUriとして使用されます:
callbackUri: myapp://callback
ステップ 3:アクティビティを作成する
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.browser.customtabs.CustomTabsIntent
class HumanTokenActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val url = intent.getStringExtra(EXTRA_PROCESS_URL) ?: return finish()
CustomTabsIntent.Builder()
.build()
.launchUrl(this, Uri.parse(url))
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intent.data?.let { uri ->
if (uri.scheme == "myapp") {
// Journey completed — send processId to your backend
val processId = uri.getQueryParameter("id")
handleResult(processId)
}
}
}
private fun handleResult(processId: String?) {
// Fetch the result from your backend via Get Process
finish()
}
companion object {
const val EXTRA_PROCESS_URL = "process_url"
}
}
ステップ 4:AndroidManifest.xmlを設定する
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<activity
android:name=".HumanTokenActivity"
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, HumanTokenActivity::class.java)
.putExtra(HumanTokenActivity.EXTRA_PROCESS_URL, processLink)
startActivity(intent)
ファイルの概要
| ファイル | 目的 |
|---|---|
build.gradle | androidx.browser依存関係 |
HumanTokenActivity.kt | Custom Tabsの起動 + リダイレクト処理 |
AndroidManifest.xml | URLスキームのIntentフィルター |
Custom Tabs の代わりに WebView を使用する
警告
Custom Tabs が推奨されるアプローチです。より安全で、リダイレクトをネイティブに処理し、設定が少なくて済みます。プロジェクトで Custom Tabs が使えない場合のみ WebView を使用してください。
WebView を使用する必要がある場合、ジャーニーには 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 に CAMERA、INTERNET、ACCESS_FINE_LOCATION パーミッションを宣言し、ジャーニーURLを読み込む前にカメラと位置情報のパーミッションをランタイムでリクエストする必要があります。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />