Uygulamanızı PiP için ayarlama

AndroidManifest.xml dosyanızın etkinlik etiketinde aşağıdakileri yapın:

  1. Uygulamanızda PiP'yi kullanacağınızı beyan etmek için supportsPictureInPicture ekleyin ve true olarak ayarlayın.
  2. Etkinliğinizin, düzen yapılandırması değişikliklerini işlediğini belirtmek için configChanges ekleyin ve orientation|screenLayout|screenSize|smallestScreenSize olarak ayarlayın. Bu sayede, PIP modu geçişlerinde düzen değişiklikleri olduğunda etkinliğiniz yeniden başlatılmaz.

      <activity
        android:name=".SnippetsActivity"
        android:exported="true"
        android:supportsPictureInPicture="true"
        android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
        android:theme="@style/Theme.Snippets">

Oluşturma kodunuzda aşağıdakileri yapın:

  1. Bu uzantıyı Context'ye ekleyin. Etkinliğe erişmek için rehber boyunca bu uzantıyı birden çok kez kullanacaksınız.
    internal fun Context.findActivity(): ComponentActivity {
        var context = this
        while (context is ContextWrapper) {
            if (context is ComponentActivity) return context
            context = context.baseContext
        }
        throw IllegalStateException("Picture in picture should be called in the context of an Activity")
    }

Android 12 öncesi sürümlerde uygulamadan ayrılırken PiP ekleme

Android 12 öncesi sürümlerde PIP eklemek için addOnUserLeaveHintProvider simgesini kullanın. Android 12 öncesi sürümler için PiP'yi eklemek üzere aşağıdaki adımları uygulayın:

  1. Bu koda yalnızca O ile R arasındaki sürümlerde erişilebilmesi için bir sürüm kapısı ekleyin.
  2. Anahtar olarak Context içeren bir DisposableEffect kullanın.
  3. DisposableEffect içinde, onUserLeaveHintProvider tetiklendiğinde lambda kullanarak davranışı tanımlayın. Lambda'da, findActivity() üzerinde enterPictureInPictureMode() işlevini çağırın ve PictureInPictureParams.Builder().build() değerini iletin.
  4. findActivity() kullanarak addOnUserLeaveHintListener ekleyin ve lambda'yı iletin.
  5. onDispose alanına findActivity() kullanarak removeOnUserLeaveHintListener ekleyin ve lambda'yı iletin.

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

Android 12'den sonraki sürümler için uygulamada PiP ekleme

Android 12'den sonra PictureInPictureParams.Builder, uygulamanın video oynatıcısına iletilen bir değiştirici aracılığıyla eklenir.

  1. Bir modifier oluşturup onGloballyPositioned'yi çağırın. Düzen koordinatları sonraki bir adımda kullanılacaktır.
  2. PictureInPictureParams.Builder() için bir değişken oluşturun.
  3. SDK'nın S veya daha yeni bir sürüm olup olmadığını kontrol etmek için bir if beyanı ekleyin. Bu durumda, setAutoEnterEnabled öğesini oluşturucuya ekleyin ve kaydırarak PiP moduna girmek için true olarak ayarlayın. Bu, enterPictureInPictureMode üzerinden geçmekten daha akıcı bir animasyon sağlar.
  4. setPictureInPictureParams()'u aramak için findActivity() kullanın. builder'da build()'yi arayın ve bu numarayı iletin.

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

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

PiP penceresinin en boy oranını ayarlamak için setAspectRatio simgesini kullanın.

PiP penceresinin en boy oranını ayarlamak için belirli bir en boy oranı seçebilir veya oynatıcının video boyutunun genişliğini ve yüksekliğini kullanabilirsiniz. media3 oynatıcı kullanıyorsanız en boy oranını ayarlamadan önce oynatıcının null olmadığını ve oynatıcının video boyutunun [VideoSize.UNKNOWN][6] değerine eşit olmadığını kontrol edin.

val context = LocalContext.current

val pipModifier = modifier.onGloballyPositioned { layoutCoordinates ->
    val builder = PictureInPictureParams.Builder()
    if (shouldEnterPipMode && player != null && player.videoSize != VideoSize.UNKNOWN) {
        val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect()
        builder.setSourceRectHint(sourceRect)
        builder.setAspectRatio(
            Rational(player.videoSize.width, player.videoSize.height)
        )
    }

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

VideoPlayer(pipModifier)

Özel bir oynatıcı kullanıyorsanız oynatıcınıza özgü söz dizimi kullanarak oynatıcının yüksekliği ve genişliği için en boy oranını ayarlayın. Oynatıcınız, başlatma sırasında yeniden boyutlandırılırsa ve en boy oranının geçerli sınırlarının dışına çıkarsa uygulamanızın kilitleneceğini unutmayın. Media3 oynatıcıda olduğu gibi, en boy oranının ne zaman hesaplanabileceğiyle ilgili kontroller eklemeniz gerekebilir.