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.
Óculos com áudio e
tela

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

Declarar as permissões no manifesto do app

Antes de solicitar permissões, é necessário declará-las 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ão 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 tela:

  • Solicitar permissões de execução de uma atividade projetada
  • Solicitar permissões de execução de uma atividade no 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 tela 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 segmenta explicitamente as permissões de execução para óculos de áudio e tela, em vez do 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 fecha a atividade complementar projetada automaticamente. Nos óculos com áudio, isso ocorre depois que o alerta de áudio termina de tocar. Em óculos com tela, 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 de exibição, em vez do smartphone host.
  • Seu app precisa processar os resultados concedidos e negados de forma adequada.

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 de tela (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, use um ID do dispositivo adequado 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 o áudio ou os óculos de exibição, em vez do smartphone host.
  • Seu app precisa processar os resultados concedidos e negados de forma adequada.