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

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

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

Jetpack で PiP を実装する

Jetpack ピクチャー イン ピクチャー ライブラリを使用して、ピクチャー イン ピクチャー エクスペリエンスを実装します。統合が効率化され、アプリ内での一般的な問題が軽減されます。使用例については、プラットフォーム サンプルアプリをご覧ください。ただし、プラットフォーム API を使用して PiP を実装する場合は、次のドキュメントを参照してください。

PIP モードで UI を処理する

PiP モードに切り替えると、アプリの UI 全体が PiP ウィンドウに表示されます。ただし、PiP モードの内外で UI をどのように表示するかを指定している場合は、その指定に従います。

まず、アプリが PiP モードかどうかを把握する必要があります。これを行うには、OnPictureInPictureModeChangedProvider を使用します。次のコードは、アプリがピクチャー イン ピクチャー モードかどうかを確認します。

@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() を使用して、アプリがピクチャー イン ピクチャー モードに切り替わったときに表示する 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()
}