Solicitar permissões de hardware para óculos de áudio e de exibição

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Áudio e
óculos com tela virtual

Assim como em um smartphone, o acesso a hardware sensível, como a câmera e o microfone dos óculos com áudio e de tela, exige o consentimento do usuário explícito. Essas são consideradas permissões específicas para óculos, e o app precisa solicitá-las no momento da execução, mesmo que já tenha as permissões correspondentes no smartphone.

Declare as permissões no manifesto do app

Antes de solicitar permissões, declare-as no arquivo de manifesto do app usando o elemento <uses-permission>. Essa declaração permanece a mesma, seja a permissão para um recurso específico de smartphone ou de óculos, mas ainda é necessário solicitá-la explicitamente para hardware ou funcionalidades específicas de óculos.

<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>

Antes de solicitar permissões para os óculos

Consulte os princípios e fluxos de trabalho de permissões para garantir que você ofereça a melhor experiência aos usuários, como verificar se o usuário já concedeu as permissões de execução que o app exige e se o app precisa mostrar uma justificativa ao usuário antes de solicitar permissões específicas para os óculos.

Cenários de permissões

Há vários cenários que você pode encontrar ao solicitar permissões de execução perigosas em óculos de áudio e com tela virtual:

  • Solicitar permissões de execução de uma atividade projetada
  • Solicitar permissões de execução de uma atividade do smartphone

Consulte as seções a seguir neste guia para saber mais sobre cada cenário.

Solicitar permissões de execução de uma atividade projetada

Para solicitar permissões de execução para óculos de áudio ou com tela virtual de uma atividade projetada, use o método ProjectedActivityCompat.requestPermissions.

A chamada desse método aciona um fluxo do usuário coordenado nos óculos e no smartphone host.

  1. Nos óculos: o sistema abre uma atividade complementar projetada nos óculos, instruindo o usuário a verificar o smartphone para responder à solicitação de permissão.
  2. No smartphone: uma caixa de diálogo de permissão do sistema Android aparece na tela do smartphone. A caixa de diálogo indica explicitamente que o usuário está concedendo a permissão para os óculos, e não para o smartphone. O usuário pode conceder ou negar a solicitação.

O exemplo a seguir mostra como solicitar permissões de óculos de uma atividade projetada:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
private fun requestCameraPermission() {
    lifecycleScope.launch {
        try {
            ProjectedActivityCompat.requestPermissions(
                this@PermissionsFromProjectedActivity,
                arrayOf(Manifest.permission.CAMERA),
                // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant
                CAMERA_PERMISSION_REQUEST_CODE,
            )
        } catch (e: IllegalStateException) {
            // Thrown when the projected system service can't be bound.
            Log.e(TAG, "Camera permission request failed: projected service unavailable.", e)
        }
    }
}

Pontos principais sobre o código

  • Use ProjectedActivityCompat.requestPermissions em vez do método padrão ActivityCompat. Esse método tem como destino explícito as permissões de tempo de execução para óculos de áudio e display, e não o smartphone host.

Processar os resultados da permissão

Depois que o usuário responde à caixa de diálogo de permissão no smartphone, a decisão é enviada ao app invocando o callback onRequestPermissionsResult.

O sistema encerra automaticamente a atividade complementar projetada. Nos óculos de áudio, isso acontece depois que o alerta de áudio termina de tocar. Em óculos de exibição, isso acontece depois que o usuário responde a todas as caixas de diálogo de permissão.

Para processar a resposta, substitua onRequestPermissionsResult() na instância Activity que iniciou a solicitação de permissão.

O snippet de código a seguir mostra como processar o callback e verificar se o usuário concedeu as permissões solicitadas:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Pontos principais sobre o código
  • Use a sobrecarga deviceId com o callback onRequestPermissionsResult para garantir que o status da permissão seja mapeado corretamente para o contexto específico, como o áudio ou os óculos com tela virtual, em vez do smartphone host.
  • O app precisa processar os resultados concedidos e negados corretamente.

Solicitar permissões de execução em uma atividade do smartphone

Se o app estiver sendo executado em uma atividade do smartphone, mas precisar de permissões para áudio ou óculos com tela virtual (por exemplo, para permitir que um usuário mude um stream de vídeo para a câmera dos óculos para uma perspectiva em primeira pessoa), solicite as permissões usando o método Activity#requestPermissions(permissions, requestCode, deviceId) específico do dispositivo:

// Request the projected permission from phone activity
requestPermissions(
    arrayOf(Manifest.permission.CAMERA),
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
    REQUEST_CODE_GLASSES_CAMERA,
    projectedDeviceId
)

Pontos principais sobre o código

  • Para segmentar óculos de áudio e tela, extraia o ID do dispositivo apropriado de um contexto projetado que você criou usando createProjectedDeviceContext. Transmita esse ID com sua chamada para o método requestPermissions.

Processar os resultados da permissão

Depois que o usuário responde à caixa de diálogo de permissão no smartphone, a decisão é enviada ao app invocando o callback onRequestPermissionsResult.

Para processar a resposta, substitua onRequestPermissionsResult na instância Activity que iniciou a solicitação de permissão.

O snippet de código a seguir mostra como processar o callback e verificar se o usuário concedeu as permissões solicitadas:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Pontos principais sobre o código
  • Use a sobrecarga deviceId com o callback onRequestPermissionsResult para garantir que o status da permissão seja mapeado corretamente para o contexto específico, como os óculos de áudio ou de exibição, em vez do smartphone host.
  • O app precisa processar os resultados concedidos e negados corretamente.