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() }