برنامه خود را برای PiP تنظیم کنید

در تگ فعالیت فایل AndroidManifest.xml ، موارد زیر را انجام دهید:

  1. supportsPictureInPicture اضافه کنید و آن را روی true تنظیم کنید تا اعلام کنید از PiP در برنامه خود استفاده می کنید.
  2. 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">

در کد نوشتن، موارد زیر را انجام دهید:

  1. این پسوند را به 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 این مراحل را دنبال کنید:

  1. یک نسخه گیت اضافه کنید تا این کد فقط در نسخه های O تا R قابل دسترسی باشد.
  2. از یک DisposableEffect با Context به عنوان کلید استفاده کنید.
  3. در داخل DisposableEffect ، رفتار زمانی که onUserLeaveHintProvider با استفاده از لامبدا راه اندازی می شود را تعریف کنید. در لامبدا، enterPictureInPictureMode() در findActivity() فراخوانی کنید و از PictureInPictureParams.Builder().build() عبور دهید.
  4. addOnUserLeaveHintListener با استفاده از findActivity() اضافه کنید و لامبدا را ارسال کنید.
  5. در 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 از طریق یک اصلاح کننده که به پخش کننده ویدیوی برنامه ارسال می شود، اضافه می شود.

  1. یک modifier بسازید و روی آن onGloballyPositioned را فراخوانی کنید. مختصات طرح در مرحله بعد استفاده خواهد شد.
  2. یک متغیر برای PictureInPictureParams.Builder() ایجاد کنید.
  3. برای بررسی اینکه آیا SDK S یا بالاتر است، یک عبارت if اضافه کنید. اگر چنین است، setAutoEnterEnabled به سازنده اضافه کنید و آن را روی true تنظیم کنید تا با کشیدن انگشت وارد حالت PiP شوید. این یک انیمیشن روان‌تر از ورود به حالت enterPictureInPictureMode ارائه می‌کند.
  4. از 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 انجام می شود.