در تگ فعالیت فایل AndroidManifest.xml
، موارد زیر را انجام دهید:
-
supportsPictureInPicture
اضافه کنید و آن را رویtrue
تنظیم کنید تا اعلام کنید از PiP در برنامه خود استفاده می کنید. configChanges
را اضافه کنید و آن را رویorientation|screenLayout|screenSize|smallestScreenSize
تنظیم کنید تا مشخص کنید که فعالیت شما تغییرات پیکربندی طرح را انجام دهد. به این ترتیب، وقتی تغییرات طرحبندی در طول انتقال حالت PiP رخ میدهد، فعالیت شما دوباره راهاندازی نمیشود.<activity android:name=".SnippetsActivity" android:exported="true" android:supportsPictureInPicture="true" android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize" android:theme="@style/Theme.Snippets">
در کد نوشتن، موارد زیر را انجام دهید:
- این پسوند را به
Context
اضافه کنید. از این برنامه افزودنی چندین بار در طول راهنما برای دسترسی به فعالیت استفاده خواهید کرد.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") }
برنامه PiP on مرخصی را برای نسخه پیش از اندروید 12 اضافه کنید
برای افزودن PiP برای نسخه پیش از اندروید 12، از addOnUserLeaveHintProvider
استفاده کنید. برای افزودن PiP برای نسخه پیش از اندروید 12 این مراحل را دنبال کنید:
- یک نسخه گیت اضافه کنید تا این کد فقط در نسخه های O تا R قابل دسترسی باشد.
- از یک
DisposableEffect
باContext
به عنوان کلید استفاده کنید. - در داخل
DisposableEffect
، رفتار زمانی کهonUserLeaveHintProvider
با استفاده از لامبدا راه اندازی می شود را تعریف کنید. در لامبدا،enterPictureInPictureMode()
درfindActivity()
فراخوانی کنید و ازPictureInPictureParams.Builder().build()
عبور دهید. -
addOnUserLeaveHintListener
با استفاده ازfindActivity()
اضافه کنید و لامبدا را ارسال کنید. - در
onDispose
،removeOnUserLeaveHintListener
با استفاده ازfindActivity()
اضافه کنید و لامبدا را وارد کنید.
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") }
برنامه PiP on مرخصی را برای پس از اندروید 12 اضافه کنید
پس از اندروید 12، PictureInPictureParams.Builder
از طریق یک اصلاح کننده که به پخش کننده ویدیوی برنامه ارسال می شود، اضافه می شود.
- یک
modifier
بسازید و روی آنonGloballyPositioned
را فراخوانی کنید. مختصات طرح در مرحله بعد استفاده خواهد شد. - یک متغیر برای
PictureInPictureParams.Builder()
ایجاد کنید. - برای بررسی اینکه آیا SDK S یا بالاتر است، یک عبارت
if
اضافه کنید. اگر چنین است،setAutoEnterEnabled
به سازنده اضافه کنید و آن را رویtrue
تنظیم کنید تا با کشیدن انگشت وارد حالت PiP شوید. این یک انیمیشن روانتر از ورود به حالتenterPictureInPictureMode
ارائه میکند. - از
findActivity()
برای فراخوانیsetPictureInPictureParams()
استفاده کنید.build()
رویbuilder
فراخوانی کنید و آن را ارسال کنید.
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)
از setAspectRatio
برای تنظیم نسبت ابعاد پنجره PiP استفاده کنید
برای تنظیم نسبت تصویر پنجره PiP، می توانید نسبت تصویر خاصی را انتخاب کنید یا از عرض و ارتفاع اندازه ویدیوی پخش کننده استفاده کنید. اگر از پخش کننده media3 استفاده می کنید، قبل از تنظیم نسبت تصویر، بررسی کنید که پخش کننده خالی نباشد و اندازه ویدیوی پخش کننده برابر با [ VideoSize.UNKNOWN
][6] نباشد.
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)
اگر از پخش کننده سفارشی استفاده می کنید، با استفاده از نحو مخصوص پخش کننده خود، نسبت ابعاد را بر روی ارتفاع و عرض پخش کننده تنظیم کنید. توجه داشته باشید که اگر اندازه پخش کننده شما در حین مقداردهی اولیه تغییر اندازه دهد، اگر خارج از محدوده معتبر نسبت ابعاد باشد، برنامه شما از کار می افتد. ممکن است لازم باشد بررسی هایی را در زمانی که می توان نسبت تصویر را محاسبه کرد، اضافه کنید، مشابه روشی که برای پخش کننده media3 انجام می شود.