راه‌اندازی برنامه برای «تصویردرتصویر»

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

  1. supportsPictureInPicture را اضافه کنید و آن را روی true تنظیم کنید تا اعلام کنید که از تصویردرتصویر (PiP) در برنامه‌تان استفاده خواهید کرد.
  2. configChanges را اضافه کنید و آن را روی orientation|screenLayout|screenSize|smallestScreenSize تنظیم کنید تا مشخص شود فعالیت شما تغییرات پیکربندی چیدمان را مدیریت می‌کند. به‌این‌ترتیب، وقتی تغییرات چیدمان درطول انتقال‌های حالت «تصویر در تصویر» رخ می‌دهد، فعالیت شما مجدداً راه‌اندازی نمی‌شود.
<activity
    android:name=".SnippetsActivity"
    android:exported="true"
    android:supportsPictureInPicture="true"
    android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
    android:theme="@style/Theme.Snippets">

در کد Compose، کارهای زیر را انجام دهید:

  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 در برنامه خروج برای نسخه‌های قبل‌از Android 12

برای افزودن PiP برای نسخه‌های قبل‌از Android 12، از addOnUserLeaveHintProvider استفاده کنید. برای افزودن PiP در نسخه‌های قبل‌از Android 12، این مراحل را دنبال کنید:

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

افزودن PiP در برنامه خروج برای نسخه‌های بعداز Android 12

پس‌از Android 12، PictureInPictureParams.Builder ازطریق اصلاح‌کننده‌ای که به پخش‌کننده ویدیو برنامه ارسال می‌شود اضافه می‌شود.

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

برای تنظیم نسبت ابعادی پنجره «تصویر در تصویر»، می‌توانید نسبت ابعادی خاصی را انتخاب کنید یا از عرض و ارتفاع اندازه ویدیو پخش‌کننده استفاده کنید. اگر از پخش‌کننده media3 استفاده می‌کنید، پیش‌از تنظیم نسبت ابعادی، بررسی کنید که پخش‌کننده تهی نباشد و اندازه ویدیو پخش‌کننده برابر با VideoSize.UNKNOWN نباشد.

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.