PiP'yi doğru zamanlarda girme

Uygulamanız aşağıdaki durumlarda PiP moduna girmemelidir:

  • Video durdurulmuş veya duraklatılmışsa.
  • Uygulamanın video oynatıcıdan farklı bir sayfasındaysanız.

Uygulamanızın ne zaman PiP moduna gireceğini kontrol etmek için mutableStateOf kullanarak video oynatıcının durumunu izleyen bir değişken ekleyin.

Videonun oynatılıp oynatılmamasına göre durumu değiştirme

Durumu, video oynatıcının oynayıp oynamadığına göre değiştirmek için video oynatıcıya bir dinleyici ekleyin. Durum değişkeninizin durumunu, oyuncunun oynayıp oynamadığına göre değiştirin:

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

Oyuncu serbest bırakılıp bırakılmadığına bağlı olarak durumu değiştirin

Oyuncu serbest bırakıldığında durum değişkeninizi false olarak ayarlayın:

fun releasePlayer() {
    shouldEnterPipMode = false
}

PiP moduna girilip girilmediğini tanımlamak için durum özelliğini kullanın (Android 12 öncesi)

  1. 12'den önceki sürümlerde PiP eklemek için DisposableEffect kullanıldığı için newValue durum değişkeniniz olarak ayarlayarak rememberUpdatedState ile yeni bir değişken oluşturmanız gerekir. Bu işlem, güncellenmiş sürümün DisposableEffect içinde kullanılmasını sağlar.
  2. OnUserLeaveHintListener tetiklendiğinde davranışı tanımlayan lambda'ya, enterPictureInPictureMode() çağrısının etrafına durum değişkenini içeren bir if ifadesi ekleyin:

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

PiP moduna girilip girilmediğini tanımlamak için durum bilgisini kullanma (Android 12'den sonra)

Uygulamanızın yalnızca doğru zamanda PiP moduna girmesi için durum değişkeninizi setAutoEnterEnabled içine aktarın:

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)

Sorunsuz bir animasyon uygulamak için setSourceRectHint simgesini kullanın

setSourceRectHint API, PiP moduna geçiş için daha akıcı bir animasyon oluşturur. Android 12 ve sonraki sürümlerde, PiP modundan çıkmak için daha akıcı bir animasyon da oluşturur. PiP'ye geçişten sonra etkinliğin görünür alanını belirtmek için bu API'yi PiP oluşturucuya ekleyin.

  1. setSourceRectHint() değerini builder değerine yalnızca uygulamanın PiP moduna girmesini tanımlayan durum varsa ekleyin. Bu sayede, uygulamanın PiP'ye girmesi gerekmediğinde sourceRect hesaplanması önlenir.
  2. sourceRect değerini ayarlamak için değiştiricideki onGloballyPositioned işlevinden verilen layoutCoordinates değerini kullanın.
  3. builder üzerinde setSourceRectHint() işlevini çağırın ve sourceRect değişkenini iletin.

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)