スマートフォンと同様に、AI グラスのカメラやマイクなどの機密性の高いハードウェアにアクセスするには、ユーザーの明示的な同意が必要です。これらはメガネ固有の権限と見なされ、アプリがスマートフォンで対応する権限をすでに持っている場合でも、実行時にリクエストする必要があります。
このガイドでは、次の方法について説明します。
- アプリのマニフェストで権限を宣言する
- 権限をリクエストする
- 権限のユーザーフローについて
アプリのマニフェストで権限を宣言する
権限をリクエストする前に、<uses-permission> 要素を使用して、アプリのマニフェスト ファイルで権限を宣言する必要があります。この宣言は、権限がスマートフォン用か AI グラス固有の機能用かに関わらず同じですが、グラス固有のハードウェアまたは機能については明示的にリクエストする必要があります。
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for the microphone. -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application ...>
...
</application>
</manifest>
権限をリクエストする
AI グラスの権限をリクエストするには、ProjectedPermissionsResultContract() メソッドで ActivityResultLauncher を使用します。アプリに必要な権限(Manifest.permission.CAMERA や Manifest.permission.RECORD_AUDIO など)を指定する必要があります。アプリにこれらの権限が必要な理由を明確かつ簡潔に説明する。この理由はユーザーに表示され、ユーザーが十分な情報に基づいて判断するのに役立ちます。
class SampleGlassesActivity : ComponentActivity() {
// Register the permissions launcher
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
// Check the result for the specific RECORD_AUDIO permission
if (results[Manifest.permission.RECORD_AUDIO] == true) {
onPermissionGranted()
} else {
onPermissionDenied()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Audio permission is critical for the displayless AI glasses experience
checkAndRequestAudioPermission()
setContent {
GlimmerTheme {
DisplayGlassesUi()
}
}
}
// Checks for the required RECORD_AUDIO permission and requests it if necessary.
private fun checkAndRequestAudioPermission() {
val permission = Manifest.permission.RECORD_AUDIO
val permissionStatus = ContextCompat.checkSelfPermission(this, permission)
if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
// Permission is already granted
onPermissionGranted()
} else {
// Permission is not granted, request it
requestAudioPermission()
}
}
private fun requestAudioPermission() {
val params = ProjectedPermissionsRequestParams(
permissions = listOf(Manifest.permission.RECORD_AUDIO),
// The rationale should explain why this permission is needed.
// For displayless AI glasses, it's often the main input mechanism.
rationale = "Microphone access is essential for voice commands and features on these AI glasses."
)
requestPermissionLauncher.launch(listOf(params))
}
private fun onPermissionGranted() {
// Implement the logic for when the permission is granted
}
private fun onPermissionDenied() {
// Implement the logic for when the permission is denied.
// On displayless AI glasses, if the app requires voice/mic it should exit the activity if the critical permission is denied.
finish()
}
}
コードに関する主なポイント
ProjectedPermissionsResultContract()メソッドを使用してActivityResultLauncherを作成します。コールバックは、権限名とその付与ステータスのマップを受け取ります。requestAudioPermission()関数はProjectedPermissionsRequestParamsオブジェクトをビルドします。このオブジェクトは、必要な権限のリストとユーザー向けの理由をバンドルします。- ランチャーで
launch()を呼び出すと、権限リクエストのユーザーフローがトリガーされます。 - アプリは、ランチャーのコールバックで、許可された結果と拒否された結果の両方を適切に処理する必要があります。
権限リクエストのユーザーフローを理解する
ProjectedPermissionsResultContract() メソッドを使用して権限リクエストを開始すると、システムは AI グラスとスマートフォンの両方で連携したユーザーフローを開始します。
権限のユーザーフローでは、アプリとユーザーは次のことを想定できます。
AI グラスの場合: 投影デバイス(グラス)にアクティビティが表示され、続行するにはスマートフォンを見るようユーザーに指示されます。
スマートフォン: 同時に、ホストデバイス(スマートフォン)でアクティビティが起動します。この画面には、提供した理由文字列が表示され、ユーザーは続行またはキャンセルを選択できます。
スマートフォン: ユーザーが説明を受け入れると、変更された Android システム権限ダイアログがスマートフォンに表示され、ユーザーがスマートフォンではなく AI グラス デバイスに権限を付与していることが通知されます。ユーザーは正式に権限を付与または拒否できます。
結果の受信: ユーザーが最終的な選択を行うと、スマートフォンと AI グラスの両方のアクティビティが閉じられます。次に、リクエストされた各権限の付与ステータスを含むマップを使用して
ActivityResultLauncherコールバックが呼び出されます。