スマートフォンと同様に、オーディオ グラスやディスプレイ グラスのカメラやマイクなどの機密性の高いハードウェアにアクセスするには、ユーザーの明示的な同意が必要です。これらは グラス固有の権限と見なされ、スマートフォンにすでに対応する権限がある場合でも、アプリは実行時にこれらの権限をリクエストする必要があります。
アプリのマニフェストで権限を宣言する
権限をリクエストする前に、アプリのマニフェスト ファイルで権限を宣言する
必要があります。<uses-permission>この宣言は、権限がスマートフォン用かグラス固有の機能用かに関わらず同じですが、グラス固有のハードウェアまたは機能に対して明示的にリクエストする必要があります。
<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>
権限ランチャーを登録する
オーディオ グラスとディスプレイ グラスの権限をリクエストするには、まず
ActivityResultLauncher と ProjectedPermissionsResultContract
メソッドを使用して権限ランチャーを登録します。
// 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 } }
コードに関する主なポイント
- このコードでは、
ProjectedPermissionsResultContractメソッドを使用してActivityResultLauncherを作成します。コールバックは、権限名とその付与ステータスのマップを受け取ります。 - アプリに必要な権限を指定する必要があります。たとえば、
Manifest.permission.CAMERAやManifest.permission.RECORD_AUDIOなどです。
リクエスト関数を作成する
次に、アプリの権限ランチャーを使用して、実行時にユーザーに権限をリクエストする関数を作成します。
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)) }
コードに関する主なポイント
- The
requestHardwarePermissions関数は、aProjectedPermissionsRequestParamsオブジェクトを構築します。このオブジェクトは、アプリに必要な権限のリストとユーザー向けの理由をまとめたものです。アプリがこれらの権限を必要とする理由を明確かつ簡潔に説明してください。 - ランチャーで
launchを呼び出すと、権限のリクエストのユーザーフローがトリガーされます。 - アプリは、ランチャーのコールバックで、付与された結果と拒否された結果の両方を適切に処理する必要があります。
権限チェック関数を作成する
次に、ユーザーがアプリに権限を付与したかどうかを確認できる関数を作成します。
private fun hasCameraPermission(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED }
権限のリクエスト ロジックを追加する
最後に、これらの関数を使用して実行時に権限を確認してリクエストするロジックを作成します。
if (hasCameraPermission()) { initializeGlassesFeatures() } else { requestHardwarePermissions() }
コードに関する主なポイント
- ユーザーがアプリに必要な権限をすでに付与している場合は、
initializeGlassesFeatures関数が呼び出されて、アプリのエクスペリエンスが初期化されます。この関数は、AI グラスのアプリのアクティビティの一部として定義されます。
権限のリクエストのユーザーフローを理解する
ProjectedPermissionsResultContract メソッドを使用して権限のリクエストを起動すると、グラスとスマートフォンの両方で連携したユーザーフローが開始されます。
権限のユーザーフローでは、アプリとユーザーは次のことを想定できます。
グラス: 投影されたデバイス (グラス)にアクティビティが表示され、操作を続行するためにスマートフォンを見るようユーザーに指示します。
スマートフォン: 同時に、ホストデバイス (スマートフォン) でアクティビティが起動します。この画面には、指定した理由の文字列が表示され、続行またはキャンセルを選択できます。
スマートフォン: ユーザーが理由に同意すると、変更された Android システムの権限ダイアログがスマートフォンに表示され、ユーザーは グラスの権限(スマートフォンの権限ではない)を付与していることが通知されます。ユーザーは 権限を正式に付与または拒否できます。
結果の受信: ユーザーが最終的な選択を行うと、 スマートフォンとグラスの両方のアクティビティが閉じられます。Your
ActivityResultLauncherコールバックは、リクエストされた各権限の付与ステータスを含むマップを使用して、次に呼び出されます。