Uygulamanızı PiP için ayarlama

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

  1. supportsPictureInPicture öğesini ekleyin ve uygulamanızda pencere içinde pencere (PiP) özelliğini kullanacağınızı belirtmek için true olarak ayarlayın.
  2. configChanges ekleyin ve etkinliğinizin düzen yapılandırması değişikliklerini işlediğini belirtmek için orientation|screenLayout|screenSize|smallestScreenSize olarak ayarlayın. Bu sayede, PIP modu geçişleri sırasında 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">

Compose kodunuzda aşağıdakileri yapın:

  1. Bu uzantıyı Context sitesine ekleyin. Etkinliğe erişmek için bu uzantıyı rehberde 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'den önceki sürümlerde ayrılma uygulamasına POP ekleme

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

  1. Bu koda yalnızca O ile R arasındaki sürümlerde erişilebilmesi için sürüm kapısı ekleyin.
  2. Anahtar olarak Context ile 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 içinde, 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 = Runnable {
            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 sonrası sürümlerde izin uygulamasına 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şturun ve üzerinde onGloballyPositioned işlevini ç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 sonraki bir sürüm olup olmadığını kontrol etmek için if ifadesi ekleyin. Bu durumda, kaydırma işleminden sonra PiP moduna girmek için derleyiciye setAutoEnterEnabled ekleyin ve true olarak ayarlayın. Bu, enterPictureInPictureMode üzerinden gitmekten daha akıcı bir animasyon sağlar.
  4. setPictureInPictureParams() numarasını aramak için findActivity() kullanın. build() numaralı telefonu builder ile arayın ve sonucu 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 kullanma

PiP penceresinin en boy oranını ayarlamak için belirli bir en boy oranını 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 boş olmadığını ve oynatıcının video boyutunun VideoSize.UNKNOWN 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 özel söz dizimini kullanarak oynatıcının yüksekliğinde ve genişliğinde 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. En-boy oranının ne zaman hesaplanabileceğiyle ilgili kontroller eklemeniz gerekebilir. Bu, media3 oynatıcıda yapılan işleme benzer.