PIP 모드 (Picture-in-Picture) 정보

PIP (picture-in-picture)는 주로 동영상 재생에 사용되는 특수한 유형의 멀티 윈도우 모드입니다. 사용자가 기본 화면에서 앱 간에 이동하거나 콘텐츠를 탐색할 때 화면 모서리에 고정된 작은 창에서 동영상을 볼 수 있습니다.

PIP는 Android 7.0에서 사용할 수 있는 멀티 윈도우 API를 활용하여 고정 동영상 오버레이 창을 제공합니다. PIP를 앱에 추가하려면 활동을 등록하고 필요한 경우 활동을 PIP 모드로 전환하며 활동이 PIP 모드일 때 UI 요소를 숨기고 동영상 재생이 지속되게 해야 합니다.

Jetpack으로 PIP 구현

Jetpack PIP 모드 라이브러리를 사용하여 PIP 모드 환경을 구현하세요. 통합을 간소화하고 일반적인 인앱 문제를 줄여줍니다. 사용 예는 플랫폼 샘플 앱을 참고하세요. 하지만 플랫폼 API를 사용하여 PIP를 구현하려면 다음 문서를 참고하세요.

PIP 모드에서 UI 처리

PIP 모드로 전환하면 PIP 모드 안팎에서 UI가 어떻게 표시되어야 하는지 지정하지 않는 한 앱의 전체 UI가 PIP 창으로 전환됩니다.

먼저 앱이 PIP 모드인지 아닌지 알아야 합니다. OnPictureInPictureModeChangedProvider를 사용하여 이를 달성할 수 있습니다. 아래 코드는 앱이 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
    }
}

이제 rememberIsInPipMode()를 사용하여 앱이 PIP 모드로 전환될 때 표시할 UI 요소를 전환할 수 있습니다.

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