AndroidManifest.xml dosyanızın etkinlik etiketinde aşağıdakileri yapın:
supportsPictureInPictureöğesini ekleyin ve uygulamanızda pencere içinde pencere (PiP) özelliğini kullanacağınızı belirtmek içintrueolarak ayarlayın.configChangesekleyin ve etkinliğinizin düzen yapılandırması değişikliklerini işlediğini belirtmek içinorientation|screenLayout|screenSize|smallestScreenSizeolarak 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:
- Bu uzantıyı
Contextsitesine 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:
- Bu koda yalnızca O ile R arasındaki sürümlerde erişilebilmesi için sürüm kapısı ekleyin.
- Anahtar olarak
ContextileDisposableEffectkullanın. DisposableEffectiçinde,onUserLeaveHintProvidertetiklendiğinde lambda kullanarak davranışı tanımlayın. Lambda'dafindActivity()üzerindeenterPictureInPictureMode()işlevini çağırın vePictureInPictureParams.Builder().build()değerini iletin.findActivity()kullanarakaddOnUserLeaveHintListenerekleyin ve lambda'yı iletin.onDisposeiçinde,findActivity()kullanarakremoveOnUserLeaveHintListenerekleyin 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.
- Bir
modifieroluşturun ve üzerindeonGloballyPositionedişlevini çağırın. Düzen koordinatları sonraki bir adımda kullanılacaktır. PictureInPictureParams.Builder()için bir değişken oluşturun.- SDK'nın S veya sonraki bir sürüm olup olmadığını kontrol etmek için
ififadesi ekleyin. Bu durumda, kaydırma işleminden sonra PiP moduna girmek için derleyiciyesetAutoEnterEnabledekleyin vetrueolarak ayarlayın. Bu,enterPictureInPictureModeüzerinden gitmekten daha akıcı bir animasyon sağlar. setPictureInPictureParams()numarasını aramak içinfindActivity()kullanın.build()numaralı telefonubuilderile 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.