Sobre o picture-in-picture (PiP)

O picture-in-picture (PiP) é um tipo especial de modo de várias janelas usado principalmente para reprodução de vídeo. Ele permite que o usuário assista um vídeo em uma pequena janela fixada no canto da tela enquanto navega entre apps ou pelo conteúdo na tela principal.

O modo picture-in-picture aproveita as APIs de várias janelas disponíveis no Android 7.0 para fornecer a janela fixa de sobreposição de vídeo. Para adicionar o PiP ao seu app, é necessário registrar sua atividade, alternar para o modo PiP conforme necessário e garantir que os elementos da interface fiquem ocultos e que a reprodução do vídeo continue quando a atividade estiver no modo PiP.

Implementar o PiP com o Jetpack

Use a biblioteca picture-in-picture do Jetpack para implementar a experiência picture-in-picture, já que ela simplifica a integração e reduz problemas comuns no app. Consulte nosso app de exemplo da plataforma para ver um exemplo de uso. No entanto, se você preferir implementar o PiP usando as APIs da plataforma, consulte a documentação a seguir.

Processar a interface no modo PIP

Quando você entra no modo picture-in-picture, toda a interface do app entra na janela picture-in-picture, a menos que você especifique como a interface deve ficar dentro e fora do modo picture-in-picture.

Primeiro, você precisa saber quando o app está no modo picture-in-picture ou não. Para isso, use OnPictureInPictureModeChangedProvider. O código a seguir verifica se o app está no modo PIP.

@Composable
fun rememberIsInPipMode(): Boolean {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val activity = LocalContext.current.findActivity()
        var pipMode by remember { mutableStateOf(activity.isInPictureInPictureMode) }
        DisposableEffect(activity) {
            val observer = Consumer<PictureInPictureModeChangedInfo> { info ->
                pipMode = info.isInPictureInPictureMode
            }
            activity.addOnPictureInPictureModeChangedListener(
                observer
            )
            onDispose { activity.removeOnPictureInPictureModeChangedListener(observer) }
        }
        return pipMode
    } else {
        return false
    }
}

Agora, você pode usar rememberIsInPipMode() para alternar quais elementos da interface serão mostrados quando o app entrar no modo PIP:

val inPipMode = rememberIsInPipMode()

Column(modifier = modifier) {
    // This text will only show up when the app is not in PiP mode
    if (!inPipMode) {
        Text(
            text = "Picture in Picture",
        )
    }
    VideoPlayer()
}