ピクチャー イン ピクチャー(PIP)について

ピクチャー イン ピクチャー(PIP)は特別なタイプのマルチウィンドウ モードで、主に動画の再生に使用されます。ユーザーは、メイン画面でアプリ間を移動したりコンテンツをブラウジングしたりしながら、画面の隅に固定された小さなウィンドウで動画を視聴し続けることができます。

PIP は、Android 7.0 で使用可能になったマルチウィンドウ API を利用して、固定された動画オーバーレイ ウィンドウを提供します。アプリに PIP を追加するには、アクティビティを登録し、必要に応じてアクティビティを PIP モードに切り替える必要があります。アクティビティが PIP モードのときは、UI 要素を非表示にして動画の再生を続行します。

PIP モードで UI を処理する

PIP モードに入ると、アプリの UI 全体が PIP ウィンドウに入ります。ただし、PIP モードと PIP モード以外の UI の外観を指定しない限り、そうはなりません。

まず、アプリが 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()
}