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 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() 메서드를 사용하여 권한 요청을 시작하면 시스템은 AI 안경과 휴대전화 모두에서 조정된 사용자 흐름을 시작합니다.

권한 사용자 플로우 중에 앱과 사용자가 기대할 수 있는 사항은 다음과 같습니다.

  1. AI 안경: 투영된 기기(안경)에 활동이 표시되어 사용자에게 휴대전화를 보고 계속하라고 안내합니다.

  2. 휴대전화: 동시에 호스트 기기(휴대전화)에서 활동이 실행됩니다. 이 화면에는 제공한 근거 문자열이 표시되며 사용자에게 계속 진행하거나 취소할 수 있는 옵션이 제공됩니다.

  3. 휴대전화에서: 사용자가 근거를 수락하면 수정된 Android 시스템 권한 대화상자가 휴대전화에 표시되어 사용자에게 AI 안경 기기 (휴대전화 아님)에 권한을 부여하고 있음을 알리고 사용자는 권한을 공식적으로 부여하거나 거부할 수 있습니다.

  4. 결과 수신: 사용자가 최종 선택을 하면 휴대전화와 AI 안경의 활동이 모두 닫힙니다. 그러면 요청된 각 권한에 부여된 상태가 포함된 맵과 함께 ActivityResultLauncher 콜백이 호출됩니다.