AI グラスのハードウェア権限をリクエストする

対象の XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
AI グラス

スマートフォンと同様に、AI グラスのカメラやマイクなどの機密性の高いハードウェアにアクセスするには、ユーザーの明示的な同意が必要です。これらはメガネ固有の権限と見なされ、アプリがスマートフォンで対応する権限をすでに持っている場合でも、実行時にリクエストする必要があります。

アプリのマニフェストで権限を宣言する

権限をリクエストする前に、<uses-permission> 要素を使用して、アプリのマニフェスト ファイルで権限を宣言する必要があります。この宣言は、権限がスマートフォン用か AI グラス固有の機能用かに関係なく同じですが、グラス固有のハードウェアまたは機能に対して明示的にリクエストする必要があります。

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the camera. -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

権限ランチャーを登録する

AI グラスの権限をリクエストするには、まず ProjectedPermissionsResultContract メソッドで ActivityResultLauncher を使用して権限ランチャーを登録します。

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

コードに関する主なポイント

リクエスト関数を作成する

次に、アプリの権限ランチャーを使用して、実行時にユーザーに権限をリクエストする関数を作成します。

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

コードに関する主なポイント

  • requestHardwarePermissions 関数は ProjectedPermissionsRequestParams オブジェクトをビルドします。このオブジェクトは、アプリに必要な権限のリストとユーザー向けの根拠をバンドルします。アプリに権限が必要な理由を説明する、明確で簡潔な理由を提示します。
  • ランチャーで launch を呼び出すと、権限のリクエストのユーザーフローがトリガーされます。
  • アプリは、ランチャーのコールバックで、許可された結果と拒否された結果の両方を適切に処理する必要があります。

権限チェック関数を作成する

次に、ユーザーがアプリに権限を付与したかどうかを確認できる関数を作成します。

private fun hasCameraPermission(): Boolean {
    return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
            PackageManager.PERMISSION_GRANTED
}

権限のリクエストのロジックを追加する

最後に、これらの関数を使用して実行時に権限を確認してリクエストするロジックを作成します。

if (hasCameraPermission()) {
    initializeGlassesFeatures()
} else {
    requestHardwarePermissions()
}

コードに関する主なポイント

  • ユーザーがアプリに必要な権限をすでに付与している場合は、initializeGlassesFeatures 関数が呼び出され、アプリのエクスペリエンスが初期化されます。この関数は、AI グラス用アプリのアクティビティの一部として定義されます。

権限のリクエストのユーザーフローを理解する

ProjectedPermissionsResultContract メソッドを使用して権限のリクエストを開始すると、システムは AI グラスとスマートフォンの両方で連携したユーザーフローを開始します。

権限のユーザーフローでは、アプリとユーザーは次のことを想定できます。

  1. AI グラスの場合: 投影デバイス(グラス)にアクティビティが表示され、続行するにはスマートフォンを見るようユーザーに指示されます。

  2. スマートフォン: 同時に、ホストデバイス(スマートフォン)でアクティビティが起動します。この画面には、提供した理由文字列が表示され、ユーザーは続行またはキャンセルを選択できます。

  3. スマートフォン: ユーザーが理由を受け入れると、変更された Android システム権限ダイアログがスマートフォンに表示され、ユーザーがスマートフォンではなく AI グラス デバイスに権限を付与していることが通知されます。ユーザーは正式に権限を付与または拒否できます。

  4. 結果の受信: ユーザーが最終的な選択を行うと、スマートフォンと AI グラスの両方のアクティビティが閉じられます。次に、リクエストされた各権限の付与ステータスを含むマップを使用して、ActivityResultLauncher コールバックが呼び出されます。