AndroidManifest.xml
dosyanızın etkinlik etiketinde aşağıdakileri yapın:
- Uygulamanızda PiP'yi kullanacağınızı beyan etmek için
supportsPictureInPicture
ekleyin vetrue
olarak ayarlayın. Etkinliğinizin, düzen yapılandırması değişikliklerini işlediğini belirtmek için
configChanges
ekleyin veorientation|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:
- 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:
- Bu koda yalnızca O ile R arasındaki sürümlerde erişilebilmesi için bir sürüm kapısı ekleyin.
- Anahtar olarak
Context
içeren birDisposableEffect
kullanın. DisposableEffect
içinde,onUserLeaveHintProvider
tetiklendiğinde lambda kullanarak davranışı tanımlayın. Lambda'da,findActivity()
üzerindeenterPictureInPictureMode()
işlevini çağırın vePictureInPictureParams.Builder().build()
değerini iletin.findActivity()
kullanarakaddOnUserLeaveHintListener
ekleyin ve lambda'yı iletin.onDispose
alanınafindActivity()
kullanarakremoveOnUserLeaveHintListener
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.
- Bir
modifier
oluşturuponGloballyPositioned
'yi ç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 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çintrue
olarak ayarlayın. Bu,enterPictureInPictureMode
üzerinden geçmekten daha akıcı bir animasyon sağlar. setPictureInPictureParams()
'u aramak içinfindActivity()
kullanın.builder
'dabuild()
'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.