Membuka PiP pada waktu yang tepat

Aplikasi Anda tidak boleh memasuki mode PiP dalam situasi berikut:

  • Jika video dihentikan atau dijeda.
  • Jika Anda berada di halaman aplikasi yang berbeda dengan pemutar video.

Untuk mengontrol kapan aplikasi Anda memasuki mode PiP, tambahkan variabel yang melacak status pemutar video menggunakan mutableStateOf.

Mengubah status berdasarkan apakah video sedang diputar

Untuk mengalihkan status berdasarkan apakah pemutar video sedang diputar, tambahkan pemroses di pemutar video. Alihkan status variabel status Anda berdasarkan apakah pemutar sedang diputar atau tidak:

player.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        shouldEnterPipMode = isPlaying
    }
})

Mengalihkan status berdasarkan apakah pemutar dilepaskan

Saat pemutar dirilis, tetapkan variabel status Anda ke false:

fun releasePlayer() {
    shouldEnterPipMode = false
}

Menggunakan status untuk menentukan apakah mode PiP dimasukkan (sebelum Android 12)

  1. Karena menambahkan PiP pra-12 menggunakan DisposableEffect, Anda perlu membuat variabel baru dengan rememberUpdatedState dengan newValue ditetapkan sebagai variabel status. Tindakan ini akan memastikan bahwa versi yang diperbarui digunakan dalam DisposableEffect.
  2. Dalam lambda yang menentukan perilaku saat OnUserLeaveHintListener dipicu, tambahkan pernyataan if dengan variabel status di sekitar panggilan ke enterPictureInPictureMode():

    val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
        Build.VERSION.SDK_INT < Build.VERSION_CODES.S
    ) {
        val context = LocalContext.current
        DisposableEffect(context) {
            val onUserLeaveBehavior: () -> Unit = {
                if (currentShouldEnterPipMode) {
                    context.findActivity()
                        .enterPictureInPictureMode(PictureInPictureParams.Builder().build())
                }
            }
            context.findActivity().addOnUserLeaveHintListener(
                onUserLeaveBehavior
            )
            onDispose {
                context.findActivity().removeOnUserLeaveHintListener(
                    onUserLeaveBehavior
                )
            }
        }
    } else {
        Log.i("PiP info", "API does not support PiP")
    }

Menggunakan status untuk menentukan apakah mode PiP dimasukkan (pasca-Android 12)

Teruskan variabel status ke setAutoEnterEnabled sehingga aplikasi Anda hanya memasuki mode PiP pada waktu yang tepat:

val pipModifier = modifier.onGloballyPositioned { layoutCoordinates ->
    val builder = PictureInPictureParams.Builder()

    // Add autoEnterEnabled for versions S and up
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        builder.setAutoEnterEnabled(shouldEnterPipMode)
    }
    context.findActivity().setPictureInPictureParams(builder.build())
}

VideoPlayer(pipModifier)

Menggunakan setSourceRectHint untuk menerapkan animasi yang lancar

API setSourceRectHint membuat animasi yang lebih lancar untuk memasuki mode PiP. Di Android 12+, fitur ini juga membuat animasi yang lebih halus untuk keluar dari mode PiP. Tambahkan API ini ke builder PiP untuk menunjukkan area aktivitas yang terlihat setelah transisi ke PiP.

  1. Hanya tambahkan setSourceRectHint() ke builder jika status menentukan bahwa aplikasi harus memasuki mode PiP. Tindakan ini menghindari penghitungan sourceRect saat aplikasi tidak perlu memasuki PiP.
  2. Untuk menetapkan nilai sourceRect, gunakan layoutCoordinates yang diberikan dari fungsi onGloballyPositioned pada pengubah.
  3. Panggil setSourceRectHint() di builder dan teruskan variabel sourceRect.

val context = LocalContext.current

val pipModifier = modifier.onGloballyPositioned { layoutCoordinates ->
    val builder = PictureInPictureParams.Builder()
    if (shouldEnterPipMode) {
        val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect()
        builder.setSourceRectHint(sourceRect)
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        builder.setAutoEnterEnabled(shouldEnterPipMode)
    }
    context.findActivity().setPictureInPictureParams(builder.build())
}

VideoPlayer(pipModifier)