PiP এর জন্য আপনার অ্যাপ সেট আপ করুন

আপনার AndroidManifest.xml ফাইলের অ্যাক্টিভিটি ট্যাগে, নিম্নলিখিতগুলি করুন:

  1. supportsPictureInPicture যোগ করুন এবং এটিকে true তে সেট করুন যাতে আপনি আপনার অ্যাপে picture-in-picture (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 অন লিভ অ্যাপ যোগ করুন

প্রি-অ্যান্ড্রয়েড ১২-এর জন্য PiP যোগ করতে, addOnUserLeaveHintProvider ব্যবহার করুন। প্রি-অ্যান্ড্রয়েড ১২-এর জন্য PiP যোগ করতে এই ধাপগুলি অনুসরণ করুন:

  1. একটি ভার্সন গেট যোগ করুন যাতে এই কোডটি শুধুমাত্র ভার্সন O থেকে R পর্যন্ত অ্যাক্সেস করা যায়।
  2. কী হিসেবে Context সহ একটি DisposableEffect ব্যবহার করুন।
  3. DisposableEffect ভেতরে, ল্যাম্বডা ব্যবহার করে onUserLeaveHintProvider কখন ট্রিগার করা হয় তার আচরণ নির্ধারণ করুন। ল্যাম্বডাতে, findActivity()enterPictureInPictureMode() কল করুন এবং PictureInPictureParams.Builder().build() এ পাস করুন।
  4. findActivity() ব্যবহার করে addOnUserLeaveHintListener যোগ করুন এবং lambda তে পাস করুন।
  5. onDispose এ, findActivity() ব্যবহার করে removeOnUserLeaveHintListener যোগ করুন এবং lambda তে পাস করুন।

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 অ্যাপ যোগ করুন

অ্যান্ড্রয়েড ১২-এর পরে, PictureInPictureParams.Builder একটি মডিফায়ারের মাধ্যমে যোগ করা হয় যা অ্যাপের ভিডিও প্লেয়ারে পাঠানো হয়।

  1. একটি modifier তৈরি করুন এবং এতে onGloballyPositioned কল করুন। লেআউট স্থানাঙ্কগুলি পরবর্তী ধাপে ব্যবহার করা হবে।
  2. PictureInPictureParams.Builder() এর জন্য একটি ভেরিয়েবল তৈরি করুন।
  3. SDK S নাকি পরবর্তী তা পরীক্ষা করার জন্য একটি if স্টেটমেন্ট যোগ করুন। যদি তাই হয়, তাহলে বিল্ডারে setAutoEnterEnabled যোগ করুন এবং সোয়াইপ করার সময় PiP মোডে প্রবেশ করার জন্য এটি true তে সেট করুন। এটি enterPictureInPictureMode এর চেয়ে মসৃণ অ্যানিমেশন প্রদান করে।
  4. setPictureInPictureParams() কল করতে findActivity() ব্যবহার করুন। builder build() কল করুন এবং এটি পাস করুন।

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 উইন্ডোর আকৃতির অনুপাত সেট করতে setAspectRatio ব্যবহার করুন।

PiP উইন্ডোর আকৃতির অনুপাত সেট করতে, আপনি হয় একটি নির্দিষ্ট আকৃতির অনুপাত বেছে নিতে পারেন অথবা প্লেয়ারের ভিডিও আকারের প্রস্থ এবং উচ্চতা ব্যবহার করতে পারেন। যদি আপনি একটি 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)

যদি আপনি একটি কাস্টম প্লেয়ার ব্যবহার করেন, তাহলে আপনার প্লেয়ারের জন্য নির্দিষ্ট সিনট্যাক্স ব্যবহার করে প্লেয়ারের উচ্চতা এবং প্রস্থের উপর আকৃতির অনুপাত সেট করুন। মনে রাখবেন যে যদি আপনার প্লেয়ারটি ইনিশিয়ালাইজেশনের সময় আকার পরিবর্তন করে, যদি এটি আকৃতির অনুপাতের বৈধ সীমার বাইরে চলে যায়, তাহলে আপনার অ্যাপটি ক্র্যাশ হয়ে যাবে। মিডিয়া3 প্লেয়ারের মতো আকৃতির অনুপাত কখন গণনা করা যেতে পারে তা পরীক্ষা করার প্রয়োজন হতে পারে।