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

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

  1. আপনি আপনার অ্যাপে PiP ব্যবহার করবেন তা ঘোষণা করতে supportsPictureInPicture যোগ করুন এবং এটিকে true সেট করুন।
  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")
    }

প্রি-অ্যান্ড্রয়েড 12-এর জন্য ছুটিতে PiP যোগ করুন

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

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

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")
}

পোস্ট-অ্যান্ড্রয়েড 12-এর জন্য ছুটিতে PiP যোগ করুন

অ্যান্ড্রয়েড 12-এর পরে, 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 উইন্ডোর আকৃতির অনুপাত সেট করতে, আপনি হয় একটি নির্দিষ্ট অনুপাত চয়ন করতে পারেন বা প্লেয়ারের ভিডিও আকারের প্রস্থ এবং উচ্চতা ব্যবহার করতে পারেন৷ আপনি যদি মিডিয়া3 প্লেয়ার ব্যবহার করেন, তাহলে অ্যাসপেক্ট রেশিও সেট করার আগে চেক করুন যে প্লেয়ারটি নাল নয় এবং প্লেয়ারের ভিডিও সাইজ [ 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)

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