পিকচার-ইন-পিকচার (PiP) ব্যবহার করুন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
জেটপ্যাক কম্পোজ হলো অ্যান্ড্রয়েডের জন্য প্রস্তাবিত UI টুলকিট। কম্পোজে কীভাবে পিকচার-ইন-পিকচার সাপোর্ট করবেন তা জানুন।

অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) থেকে, অ্যান্ড্রয়েড অ্যাক্টিভিটিগুলোকে পিকচার-ইন-পিকচার (পিআইপি) মোডে চালু করার সুযোগ দেয়। পিআইপি হলো এক বিশেষ ধরনের মাল্টি-উইন্ডো মোড, যা ভিডিও প্লেব্যাক, ভিডিও কল এবং নেভিগেশনের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীকে অ্যাপগুলোর মধ্যে নেভিগেট করার সময় বা মূল স্ক্রিনে কন্টেন্ট ব্রাউজ করার সময় বিদ্যমান অ্যাক্টিভিটি উইন্ডোটিকে স্ক্রিনের এক কোণে পিন করে রাখতে দেয়।

PiP, পিন করা ভিডিও ওভারলে উইন্ডো প্রদান করার জন্য অ্যান্ড্রয়েড ৭.০-তে উপলব্ধ মাল্টি-উইন্ডো এপিআই ব্যবহার করে। আপনার অ্যাপে PiP যোগ করতে হলে, আপনাকে PiP সমর্থনকারী অ্যাক্টিভিটিগুলো রেজিস্টার করতে হবে, প্রয়োজন অনুযায়ী আপনার অ্যাক্টিভিটিকে PiP মোডে পরিবর্তন করতে হবে এবং নিশ্চিত করতে হবে যে অ্যাক্টিভিটি PiP মোডে থাকাকালীন UI এলিমেন্টগুলো লুকানো থাকে ও ভিডিও প্লেব্যাক চলতে থাকে।

PiP উইন্ডোটি স্ক্রিনের একেবারে উপরের স্তরে, সিস্টেম দ্বারা নির্বাচিত একটি কোণায় প্রদর্শিত হয়।

অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণে চালিত সামঞ্জস্যপূর্ণ অ্যান্ড্রয়েড টিভি ওএস ডিভাইসগুলোতেও পিআইপি সমর্থিত। যদিও অনেক সাদৃশ্য রয়েছে, টিভিতে পিআইপি ব্যবহার করার সময় কিছু অতিরিক্ত বিষয় বিবেচনা করতে হয়।

ব্যবহারকারীরা কীভাবে PiP উইন্ডোর সাথে ইন্টারঅ্যাক্ট করতে পারে

ব্যবহারকারীরা PiP উইন্ডোটিকে টেনে অন্য স্থানে নিয়ে যেতে পারেন। অ্যান্ড্রয়েড ১২ থেকে ব্যবহারকারীরা আরও যা করতে পারবেন:

  • ফুল-স্ক্রিন টগল, ক্লোজ বাটন, সেটিংস বাটন এবং আপনার অ্যাপের দেওয়া কাস্টম অ্যাকশন (যেমন, প্লে কন্ট্রোল) প্রদর্শন করতে উইন্ডোটিতে একবার ট্যাপ করুন।

  • বর্তমান PiP সাইজ এবং সর্বোচ্চ বা সর্বনিম্ন PiP সাইজের মধ্যে টগল করতে উইন্ডোটিতে ডাবল-ট্যাপ করুন—উদাহরণস্বরূপ, একটি ম্যাক্সিমাইজড উইন্ডোতে ডাবল-ট্যাপ করলে তা মিনিমাইজ হয় এবং এর বিপরীতটিও সত্য।

  • উইন্ডোটিকে বাম বা ডান প্রান্তে টেনে নিয়ে স্ট্যাশ করুন। উইন্ডোটিকে আনস্ট্যাশ করতে, স্ট্যাশ করা উইন্ডোটির দৃশ্যমান অংশে ট্যাপ করুন অথবা এটিকে বাইরে টেনে আনুন।

  • পিঞ্চ-টু-জুম ব্যবহার করে PiP উইন্ডোর আকার পরিবর্তন করুন।

আপনার অ্যাপ নিয়ন্ত্রণ করে কখন বর্তমান অ্যাক্টিভিটি PiP মোডে প্রবেশ করবে। এখানে কিছু উদাহরণ দেওয়া হলো:

  • ব্যবহারকারী যখন হোম বোতামে ট্যাপ করেন বা হোমে যাওয়ার জন্য উপরে সোয়াইপ করেন, তখন কোনো অ্যাক্টিভিটি PiP মোডে প্রবেশ করতে পারে। এভাবেই ব্যবহারকারী একই সময়ে অন্য কোনো অ্যাক্টিভিটি চালালেও গুগল ম্যাপস দিকনির্দেশনা দেখানো অব্যাহত রাখে।

  • ব্যবহারকারী যখন ভিডিও থেকে অন্য কন্টেন্ট ব্রাউজ করার জন্য ফিরে যান, তখন আপনার অ্যাপ ভিডিওটিকে PiP মোডে নিয়ে যেতে পারে।

  • কোনো ব্যবহারকারী যখন কোনো কন্টেন্টের পর্বের শেষ অংশ দেখছেন, তখন আপনার অ্যাপ ভিডিওটিকে PiP মোডে পরিবর্তন করতে পারে। মূল স্ক্রিনে সিরিজটির পরবর্তী পর্ব সম্পর্কে প্রচারমূলক বা সারসংক্ষেপ তথ্য প্রদর্শিত হয়।

  • আপনার অ্যাপ ব্যবহারকারীদের ভিডিও দেখার সময় অতিরিক্ত কন্টেন্ট যুক্ত করার একটি উপায় দিতে পারে। মূল স্ক্রিনে কন্টেন্ট নির্বাচনের প্রক্রিয়াটি প্রদর্শিত হওয়ার সময় ভিডিওটি PiP মোডে চলতে থাকে।

PiP সমর্থন ঘোষণা করুন

ডিফল্টরূপে, সিস্টেম অ্যাপের জন্য স্বয়ংক্রিয়ভাবে PiP সমর্থন করে না। আপনি যদি আপনার অ্যাপে PiP সমর্থন করতে চান, তাহলে আপনার ম্যানিফেস্টে android:supportsPictureInPicture কে true সেট করে আপনার ভিডিও অ্যাক্টিভিটি রেজিস্টার করুন। এছাড়াও, নির্দিষ্ট করে দিন যে আপনার অ্যাক্টিভিটি লেআউট কনফিগারেশনের পরিবর্তনগুলো পরিচালনা করবে, যাতে PiP মোড পরিবর্তনের সময় লেআউটে পরিবর্তন ঘটলে আপনার অ্যাক্টিভিটি পুনরায় চালু না হয়।

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

জেটপ্যাকের মাধ্যমে পিআইপি বাস্তবায়ন করুন

জেটপ্যাক পিকচার-ইন-পিকচার লাইব্রেরি ব্যবহার করে পিকচার-ইন-পিকচার অভিজ্ঞতা বাস্তবায়ন করুন কারণ এটি ইন্টিগ্রেশনকে সহজ করে তোলে এবং অ্যাপ-মধ্যস্থ সাধারণ সমস্যাগুলি হ্রাস করে। এর ব্যবহারের উদাহরণ দেখতে আমাদের প্ল্যাটফর্ম নমুনা অ্যাপটি দেখুন। তবে, আপনি যদি প্ল্যাটফর্ম API ব্যবহার করে PiP বাস্তবায়ন করতে চান, তাহলে নিম্নলিখিত ডকুমেন্টেশনগুলি দেখুন।

,

জেটপ্যাকের মাধ্যমে পিআইপি বাস্তবায়ন করুন

জেটপ্যাক পিকচার-ইন-পিকচার লাইব্রেরি ব্যবহার করে পিকচার-ইন-পিকচার অভিজ্ঞতা বাস্তবায়ন করুন কারণ এটি ইন্টিগ্রেশনকে সহজ করে তোলে এবং অ্যাপ-মধ্যস্থ সাধারণ সমস্যাগুলি হ্রাস করে। এর ব্যবহারের উদাহরণ দেখতে আমাদের প্ল্যাটফর্ম নমুনা অ্যাপটি দেখুন। তবে, আপনি যদি প্ল্যাটফর্ম API ব্যবহার করে PiP বাস্তবায়ন করতে চান, তাহলে নিম্নলিখিত ডকুমেন্টেশনগুলি দেখুন।

আপনার কার্যকলাপ PiP-তে পরিবর্তন করুন

অ্যান্ড্রয়েড ১২ থেকে, আপনি setAutoEnterEnabled ফ্ল্যাগটিকে true সেট করে আপনার অ্যাক্টিভিটিকে PiP মোডে পরিবর্তন করতে পারেন। এই সেটিংয়ের ফলে, onUserLeaveHintenterPictureInPictureMode() স্পষ্টভাবে কল না করেই, একটি অ্যাক্টিভিটি প্রয়োজন অনুযায়ী স্বয়ংক্রিয়ভাবে PiP মোডে চলে যায়। এবং এর অতিরিক্ত সুবিধা হলো এটি অনেক বেশি মসৃণ ট্রানজিশন প্রদান করে। বিস্তারিত জানতে, “Make transitions to PiP mode smoother from gesture navigation” দেখুন।

আপনি যদি অ্যান্ড্রয়েড ১১ বা তার নিচের সংস্করণ ব্যবহার করেন, তাহলে PiP মোডে স্যুইচ করার জন্য একটি অ্যাক্টিভিটিকে অবশ্যই enterPictureInPictureMode() কল করতে হবে। উদাহরণস্বরূপ, নিচের কোডটি ব্যবহারকারীর অ্যাপের UI-তে থাকা একটি নির্দিষ্ট বাটনে ক্লিক করার ফলে অ্যাক্টিভিটিটিকে PiP মোডে স্যুইচ করে:

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

আপনি এমন লজিক অন্তর্ভুক্ত করতে চাইতে পারেন যা কোনো অ্যাক্টিভিটিকে ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে PiP মোডে পরিবর্তন করে। উদাহরণস্বরূপ, অ্যাপটি নেভিগেট করার সময় ব্যবহারকারী যদি হোম বা রিসেন্টস বোতাম চাপেন, তাহলে গুগল ম্যাপস PiP মোডে চলে যায়। আপনি onUserLeaveHint() ওভাররাইড করে এই পরিস্থিতিটি ধরতে পারেন:

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

সুপারিশকৃত: ব্যবহারকারীদের একটি পরিমার্জিত PiP রূপান্তর অভিজ্ঞতা প্রদান করুন।

অ্যান্ড্রয়েড ১২ ফুলস্ক্রিন এবং পিআইপি উইন্ডোগুলোর মধ্যে অ্যানিমেটেড ট্রানজিশনে বেশ কিছু বাহ্যিক উন্নতি এনেছে। আমরা দৃঢ়ভাবে সুপারিশ করছি যে আপনি প্রযোজ্য সমস্ত পরিবর্তন প্রয়োগ করুন; একবার তা করে ফেললে, এই পরিবর্তনগুলো আর কোনো কাজ ছাড়াই ফোল্ডেবল ও ট্যাবলেটের মতো বড় স্ক্রিনে স্বয়ংক্রিয়ভাবে মানিয়ে যাবে।

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

এই পরিবর্তনগুলোর মধ্যে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত।

  • জেসচার নেভিগেশন থেকে PiP মোডে রূপান্তরকে আরও মসৃণ করা
  • PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি উপযুক্ত sourceRectHint সেট করা।
  • ভিডিও নয় এমন কন্টেন্টের জন্য নির্বিঘ্ন আকার পরিবর্তন নিষ্ক্রিয় করা হচ্ছে

একটি পরিমার্জিত ট্রানজিশন অভিজ্ঞতা সক্ষম করার জন্য রেফারেন্স হিসেবে অ্যান্ড্রয়েড কোটলিন PictureInPicture স্যাম্পলটি দেখুন।

জেসচার নেভিগেশন থেকে PiP মোডে রূপান্তর আরও মসৃণ করুন

অ্যান্ড্রয়েড ১২ থেকে, setAutoEnterEnabled ফ্ল্যাগটি জেসচার নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও কন্টেন্টে ট্রানজিশনের জন্য অনেক মসৃণ অ্যানিমেশন প্রদান করে—উদাহরণস্বরূপ, ফুলস্ক্রিন থেকে হোমে যাওয়ার জন্য উপরে সোয়াইপ করার সময়।

এই পরিবর্তনটি করতে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. PictureInPictureParams.Builder তৈরি করতে setAutoEnterEnabled ব্যবহার করুন:
setPictureInPictureParams(PictureInPictureParams.Builder()
  .setAspectRatio(aspectRatio)
  .setSourceRectHint(sourceRectHint)
  .setAutoEnterEnabled(true)
  .build())
Note: When `setAutoEnterEnabled` is enabled, you don't need to explicitly
call [`enterPictureInPictureMode`][5] in [`onUserLeaveHint`][6].
  1. হালনাগাদ PictureInPictureParams দিয়ে setPictureInPictureParams আগেভাগেই কল করুন। অ্যাপটি onUserLeaveHint কলব্যাকের জন্য অপেক্ষা করে না (যেমনটি এটি অ্যান্ড্রয়েড ১১-এ করত)।

    উদাহরণস্বরূপ, আপনি হয়তো একদম প্রথম প্লেব্যাকে এবং পরবর্তী যেকোনো প্লেব্যাকে অ্যাস্পেক্ট রেশিও পরিবর্তিত হলে setPictureInPictureParams কল করতে চাইতে পারেন।

  2. setAutoEnterEnabled(false) কল করুন, কিন্তু শুধুমাত্র প্রয়োজন হলেই। উদাহরণস্বরূপ, বর্তমান প্লেব্যাকটি পজ করা অবস্থায় থাকলে আপনি সম্ভবত PiP-তে প্রবেশ করতে চাইবেন না।

PiP মোডে প্রবেশ ও প্রস্থান করার জন্য একটি উপযুক্ত sourceRectHint সেট করুন।

অ্যান্ড্রয়েড ৮.০-তে PiP (পিকচার-ইন-পিকচার) চালু হওয়ার পর থেকে, setSourceRectHint অ্যাক্টিভিটির সেই অংশটিকে নির্দেশ করত যা পিকচার-ইন-পিকচারে রূপান্তরের পর দৃশ্যমান থাকে—উদাহরণস্বরূপ, একটি ভিডিও প্লেয়ারের ভিডিও ভিউয়ের সীমানা।

অ্যান্ড্রয়েড ১২-এ, PiP মোডে প্রবেশ এবং প্রস্থান উভয় সময়েই আরও মসৃণ অ্যানিমেশন বাস্তবায়নের জন্য সিস্টেমটি sourceRectHint ব্যবহার করে।

PiP মোডে প্রবেশ ও প্রস্থান করার জন্য sourceRectHint সঠিকভাবে সেট করতে:

  1. sourceRectHint হিসেবে সঠিক বাউন্ড ব্যবহার করে PictureInPictureParams তৈরি করুন। আমরা ভিডিও প্লেয়ারে একটি লেআউট পরিবর্তন লিসেনার সংযুক্ত করারও পরামর্শ দিই:
val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, left: Int,
            top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop:
            Int, oldRight: Int, oldBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }

mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)
  1. প্রয়োজনে, সিস্টেম এক্সিট ট্রানজিশন শুরু করার আগে sourceRectHint আপডেট করুন। যখন সিস্টেম PiP মোড থেকে বের হতে যায়, তখন অ্যাক্টিভিটির ভিউ হায়ারার্কি তার গন্তব্য কনফিগারেশনে (যেমন, ফুল স্ক্রিন) বিন্যস্ত হয়। অ্যাপটি তার রুট ভিউ বা টার্গেট ভিউতে (যেমন ভিডিও প্লেয়ার ভিউ) একটি লেআউট চেঞ্জ লিসেনার সংযুক্ত করতে পারে, যাতে ইভেন্টটি শনাক্ত করা যায় এবং অ্যানিমেশন শুরু হওয়ার আগে sourceRectHint আপডেট করা যায়।
// Listener is called immediately after the user exits PiP but before animating.
playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                    oldLeft, oldTop, oldRight, oldBottom ->
    if (left != oldLeft
        || right != oldRight
        || top != oldTop
        || bottom != oldBottom) {
        // The playerView's bounds changed, update the source hint rect to
        // reflect its new bounds.
        val sourceRectHint = Rect()
        playerView.getGlobalVisibleRect(sourceRectHint)
        setPictureInPictureParams(
            PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint)
                .build()
        )
    }
}

ভিডিও নয় এমন কন্টেন্টের জন্য নির্বিঘ্ন আকার পরিবর্তন নিষ্ক্রিয় করুন

অ্যান্ড্রয়েড ১২-এ setSeamlessResizeEnabled ফ্ল্যাগটি যুক্ত করা হয়েছে, যা PiP উইন্ডোতে ভিডিও-বহির্ভূত কন্টেন্টের আকার পরিবর্তনের সময় আরও মসৃণ ক্রস-ফেডিং অ্যানিমেশন প্রদান করে। পূর্বে, PiP উইন্ডোতে ভিডিও-বহির্ভূত কন্টেন্টের আকার পরিবর্তন করলে দৃষ্টিকটু ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারত।

ভিডিও কন্টেন্টের নির্বিঘ্ন আকার পরিবর্তন সক্ষম করতে:

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(true)
    .build())

PiP চলাকালীন UI পরিচালনা করুন

যখন অ্যাক্টিভিটি পিকচার-ইন-পিকচার (PiP) মোডে প্রবেশ করে বা তা থেকে বেরিয়ে আসে, তখন সিস্টেম Activity.onPictureInPictureModeChanged() অথবা Fragment.onPictureInPictureModeChanged() কল করে।

অ্যান্ড্রয়েড ১৫-এ এমন কিছু পরিবর্তন আনা হয়েছে যা PiP মোডে প্রবেশের সময় ট্রানজিশনকে আরও মসৃণ করে তোলে। এটি সেইসব অ্যাপের জন্য উপকারী, যাদের মূল UI-এর উপরে বিভিন্ন UI এলিমেন্ট থাকে এবং সেই মূল UI-টি PiP মোডে চলে যায়।

ডেভেলপাররা ওভারলে করা UI এলিমেন্টগুলোর ভিজিবিলিটি টগল করার লজিক নির্ধারণ করতে onPictureInPictureModeChanged() কলব্যাকটি ব্যবহার করেন। PiP এন্টার বা এক্সিট অ্যানিমেশন সম্পন্ন হলে এই কলব্যাকটি ট্রিগার হয়। অ্যান্ড্রয়েড ১৫ থেকে PictureInPictureUiState ক্লাসে একটি নতুন স্টেট অন্তর্ভুক্ত করা হয়েছে।

এই নতুন UI স্টেটের ফলে, Android 15 টার্গেট করা অ্যাপগুলো লক্ষ্য করে যে PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথেই Activity#onPictureInPictureUiStateChanged() কলব্যাকটি isTransitioningToPip() সহ কল ​​করা হয়। PiP মোডে থাকাকালীন অনেক UI এলিমেন্ট অ্যাপের জন্য প্রাসঙ্গিক থাকে না, যেমন—ভিউ বা লেআউট, যেগুলোতে সাজেশন, আসন্ন ভিডিও, রেটিং এবং টাইটেলের মতো তথ্য থাকে। যখন অ্যাপটি PiP মোডে যায়, তখন এই UI এলিমেন্টগুলোকে হাইড করার জন্য onPictureInPictureUiStateChanged() কলব্যাকটি ব্যবহার করুন। যখন অ্যাপটি PiP উইন্ডো থেকে ফুল স্ক্রিন মোডে ফিরে আসে, তখন এই এলিমেন্টগুলোকে আনহাইড করার জন্য onPictureInPictureModeChanged() কলব্যাকটি ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণগুলোতে দেখানো হয়েছে:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
    if (pipState.isTransitioningToPip()) {
        // Hide UI elements.
    }
}
override fun onPictureInPictureModeChanged(
    isInPictureInPictureMode: Boolean,
    newConfig: Configuration
) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
    if (!isInPictureInPictureMode) {
        // Unhide UI elements.
    }
}

(একটি PiP উইন্ডোর জন্য) অপ্রাসঙ্গিক UI উপাদানগুলির এই দ্রুত দৃশ্যমানতা টগল করার সুবিধাটি একটি মসৃণ ও ঝিকিমিকি-মুক্ত PiP এন্টার অ্যানিমেশন নিশ্চিত করতে সাহায্য করে।

অ্যাক্টিভিটির UI এলিমেন্টগুলো পুনরায় আঁকতে এই কলব্যাকগুলো ওভাররাইড করুন। মনে রাখবেন যে, PiP মোডে আপনার অ্যাক্টিভিটি একটি ছোট উইন্ডোতে দেখানো হয়। অ্যাপটি PiP মোডে থাকলে ব্যবহারকারীরা আপনার অ্যাপের UI এলিমেন্টগুলোর সাথে ইন্টারঅ্যাক্ট করতে পারেন না এবং ছোট UI এলিমেন্টগুলোর বিবরণ দেখতে অসুবিধা হতে পারে। ন্যূনতম UI সহ ভিডিও প্লেব্যাক অ্যাক্টিভিটিগুলো সেরা ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।

আপনার অ্যাপে যদি PiP-এর জন্য কাস্টম অ্যাকশন যোগ করার প্রয়োজন হয়, তাহলে এই পৃষ্ঠার 'Add controls' অংশটি দেখুন। আপনার অ্যাক্টিভিটি PiP-তে প্রবেশ করার আগে অন্যান্য UI এলিমেন্টগুলো সরিয়ে ফেলুন এবং অ্যাক্টিভিটিটি আবার ফুল স্ক্রিন হলে সেগুলো পুনরুদ্ধার করুন।

নিয়ন্ত্রণ যোগ করুন

ব্যবহারকারী যখন উইন্ডোটির মেনু খোলেন (মোবাইল ডিভাইসে উইন্ডোটিতে ট্যাপ করে, অথবা টিভি রিমোট থেকে মেনুটি নির্বাচন করে), তখন PiP উইন্ডোটি কন্ট্রোলগুলো প্রদর্শন করতে পারে।

যদি কোনো অ্যাপে একটি সক্রিয় মিডিয়া সেশন থাকে, তাহলে প্লে, পজ, নেক্সট এবং প্রিভিয়াস কন্ট্রোলগুলো দেখা যাবে।

আপনি PiP মোডে প্রবেশ করার আগে PictureInPictureParams PictureInPictureParams.Builder.setActions() ব্যবহার করে PictureInPictureParams তৈরি করে এবং PiP মোডে প্রবেশ করার সময় enterPictureInPictureMode(android.app.PictureInPictureParams) বা setPictureInPictureParams(android.app.PictureInPictureParams) ব্যবহার করে প্যারামিটারগুলো পাস করে কাস্টম অ্যাকশনগুলো স্পষ্টভাবে নির্দিষ্ট করতে পারেন। সতর্ক থাকুন। আপনি যদি getMaxNumPictureInPictureActions() এর চেয়ে বেশি যোগ করার চেষ্টা করেন, তাহলে আপনি কেবল সর্বোচ্চ সংখ্যাটিই পাবেন।

PiP-তে থাকাকালীন ভিডিও প্লেব্যাক অব্যাহত রাখা

যখন আপনার অ্যাক্টিভিটি PiP-তে পরিবর্তিত হয়, তখন সিস্টেম অ্যাক্টিভিটিটিকে পজড অবস্থায় রাখে এবং অ্যাক্টিভিটির onPause() মেথডটি কল করে। PiP মোডে যাওয়ার সময় অ্যাক্টিভিটিটি পজড থাকলে ভিডিও প্লেব্যাক পজ না হয়ে চলতে থাকা উচিত।

অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং এর পরবর্তী সংস্করণগুলোতে, যখন সিস্টেম আপনার অ্যাক্টিভিটির onStop() এবং onStart() ফাংশন কল করে, তখন ভিডিও প্লেব্যাক পজ এবং রিজুম করা উচিত। এটি করার মাধ্যমে, আপনি onPause() ফাংশনে আপনার অ্যাপটি PiP মোডে আছে কিনা তা পরীক্ষা করা এবং প্লেব্যাক পুনরায় চালু করার ঝামেলা এড়াতে পারবেন।

যদি আপনি setAutoEnterEnabled ফ্ল্যাগটি true তে সেট না করে থাকেন এবং আপনার onPause() ইমপ্লিমেন্টেশনে প্লেব্যাক থামানোর প্রয়োজন হয়, তাহলে isInPictureInPictureMode() কল করে PiP মোড পরীক্ষা করুন এবং সেই অনুযায়ী প্লেব্যাক পরিচালনা করুন। উদাহরণস্বরূপ:

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, don't pause playback.
    if (isInPictureInPictureMode) {
        // Continue playback.
    } else {
        // Use existing playback logic for paused activity behavior.
    }
}

যখন আপনার অ্যাক্টিভিটি PiP মোড থেকে বেরিয়ে ফুল-স্ক্রিন মোডে ফিরে আসে, তখন সিস্টেম আপনার অ্যাক্টিভিটি পুনরায় চালু করে এবং আপনার onResume() মেথডটি কল করে।

PiP-এর জন্য একটিমাত্র প্লেব্যাক অ্যাক্টিভিটি ব্যবহার করুন

আপনার অ্যাপে, মূল স্ক্রিনে কন্টেন্ট ব্রাউজ করার সময় কোনো ব্যবহারকারী একটি নতুন ভিডিও নির্বাচন করতে পারেন, যখন একটি ভিডিও প্লেব্যাক অ্যাক্টিভিটি PiP মোডে থাকে। ব্যবহারকারীকে বিভ্রান্ত করতে পারে এমন একটি নতুন অ্যাক্টিভিটি চালু করার পরিবর্তে, বিদ্যমান প্লেব্যাক অ্যাক্টিভিটিতেই নতুন ভিডিওটি ফুল স্ক্রিন মোডে প্লে করুন।

ভিডিও প্লেব্যাকের অনুরোধের জন্য একটিমাত্র অ্যাক্টিভিটি ব্যবহার করা এবং প্রয়োজন অনুযায়ী সেটিকে PiP মোডে চালু বা বন্ধ করা নিশ্চিত করতে, আপনার ম্যানিফেস্টে অ্যাক্টিভিটিটির android:launchMode কে singleTask এ সেট করুন:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

আপনার অ্যাক্টিভিটিতে onNewIntent() ওভাররাইড করুন এবং নতুন ভিডিওটি হ্যান্ডেল করুন, প্রয়োজনে চলমান ভিডিও প্লেব্যাক বন্ধ করে দিন।

ক্যামেরা অ্যাপের জন্য PiP সমর্থন

ক্যামেরা অ্যাপের জন্য PiP সক্রিয় করতে, onPause() কল করা হলে ক্যামেরাটি বন্ধ না করে PiP মোডে সক্রিয় রাখা নিশ্চিত করতে হবে:

override fun onPause() {
    super.onPause()
    // Don't close the camera if the app is entering PiP mode
    if (!isInPictureInPictureMode) {
        closeCamera()
    }
}

অন্যান্য ব্যবহারের ক্ষেত্রের মতোই, অপ্রয়োজনীয় UI উপাদানগুলো (যেমন কন্ট্রোল এবং ওভারলে) লুকান এবং ক্যামেরা নিয়ন্ত্রণের জন্য কাস্টম অ্যাকশন যোগ করুন (উদাহরণস্বরূপ, রেকর্ডিং বন্ধ করা বা ক্যামেরা ফ্লিপ করা)।

মসৃণ রূপান্তরের জন্য sourceRectHint গণনা করুন

একটি মসৃণ এন্টার অ্যানিমেশনের জন্য ক্যামেরা ভিউফাইন্ডারের সঠিক স্ক্রিন স্থানাঙ্ক সহ একটি নির্ভুল sourceRectHint প্রদান করা অপরিহার্য। আপনি নিম্নলিখিতভাবে getGlobalVisibleRect() ব্যবহার করে প্রিভিউ ভিউ থেকে বাউন্ডস পেতে পারেন:

val previewView = findViewById<View>(R.id.preview_view)
val globalRect = Rect()
// Ensure the view is laid out before calling getGlobalVisibleRect() to get valid screen coordinates.
previewView.getGlobalVisibleRect(globalRect)
val params = PictureInPictureParams.Builder()
    .setSourceRectHint(globalRect)
    .build()
setPictureInPictureParams(params)

অতিরিক্ত বিবেচ্য বিষয়

কম র‍্যামযুক্ত ডিভাইসগুলিতে PiP নিষ্ক্রিয় থাকতে পারে। আপনার অ্যাপ PiP ব্যবহার করার আগে, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) কল করে নিশ্চিত হয়ে নিন যে এটি উপলব্ধ আছে।

PiP এমন অ্যাক্টিভিটিগুলোর জন্য তৈরি করা হয়েছে যেগুলো ফুল-স্ক্রিন ভিডিও প্লে করে। আপনার অ্যাক্টিভিটিকে PiP মোডে পরিবর্তন করার সময়, ভিডিও কন্টেন্ট ছাড়া অন্য কিছু দেখানো থেকে বিরত থাকুন। আপনার অ্যাক্টিভিটি কখন PiP মোডে প্রবেশ করছে তা ট্র্যাক করুন এবং "PiP চলাকালীন UI পরিচালনা" অংশে বর্ণিত পদ্ধতি অনুযায়ী UI এলিমেন্টগুলো লুকিয়ে ফেলুন।

যখন কোনো অ্যাক্টিভিটি PiP মোডে থাকে, তখন ডিফল্টরূপে এটি ইনপুট ফোকাস পায় না। PiP মোডে থাকাকালীন ইনপুট ইভেন্ট গ্রহণ করতে, MediaSession.setCallback() ব্যবহার করুন। setCallback() ব্যবহারের বিষয়ে আরও তথ্যের জন্য "একটি 'নাউ প্লেয়িং' কার্ড প্রদর্শন করুন" দেখুন।

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

যখন আপনার অ্যাপ PiP মোডে প্রবেশ করতে যাচ্ছে, তখন লক্ষ্য করুন যে শুধুমাত্র উপরের অ্যাক্টিভিটিটিই পিকচার-ইন-পিকচার মোডে যায়। কিছু ক্ষেত্রে, যেমন একাধিক উইন্ডোযুক্ত ডিভাইসে, এমনটা হতে পারে যে PiP অ্যাক্টিভিটির পাশাপাশি নিচের অ্যাক্টিভিটিটিও আবার দেখানো হবে এবং দৃশ্যমান হবে। আপনার এই পরিস্থিতিটি যথাযথভাবে সামলানো উচিত, যার মধ্যে নিচের অ্যাক্টিভিটিতে একটি onResume() বা onPause() কলব্যাক পাঠানোও অন্তর্ভুক্ত। এমনও হতে পারে যে ব্যবহারকারী অ্যাক্টিভিটিটির সাথে ইন্টারঅ্যাক্ট করতে পারেন। উদাহরণস্বরূপ, যদি আপনার একটি ভিডিও লিস্ট অ্যাক্টিভিটি প্রদর্শিত থাকে এবং প্লেয়িং ভিডিও অ্যাক্টিভিটিটি PiP মোডে থাকে, তাহলে ব্যবহারকারী তালিকা থেকে একটি নতুন ভিডিও নির্বাচন করতে পারেন এবং PiP অ্যাক্টিভিটিটি সেই অনুযায়ী আপডেট হওয়া উচিত।

অতিরিক্ত নমুনা কোড

কোটলিনে লেখা একটি নমুনা অ্যাপ ডাউনলোড করতে, Android PictureInPicture Sample (Kotlin) দেখুন।