Android 8.0 (API লেভেল ২৬) থেকে শুরু করে, Android, ছবির-মধ্যে-ছবি (PiP) মোডে অ্যাক্টিভিটি লঞ্চ করার অনুমতি দেয়। PiP হল এক বিশেষ ধরনের মাল্টি-উইন্ডো মোড যা ভিডিও প্লেব্যাক, ভিডিও কল ও নেভিগেশনের জন্য ব্যবহার করা হয়। এটি ব্যবহারকারীকে স্ক্রিনের একটি কোণে আগে থেকে থাকা অ্যাক্টিভিটি উইন্ডো পিন করতে দেয়, যখন তিনি অ্যাপের মধ্যে নেভিগেট করেন বা মূল স্ক্রিনে কন্টেন্ট ব্রাউজ করেন।
পিন করা ভিডিও ওভারলে উইন্ডো প্রদান করার জন্য PiP, Android 7.0-এ উপলভ্য মাল্টি-উইন্ডো API-এর সুবিধা নেয়। আপনার অ্যাপে PiP যোগ করতে, PiP কাজ করে এমন অ্যাক্টিভিটি রেজিস্টার করতে হবে, প্রয়োজন অনুযায়ী অ্যাক্টিভিটি PiP মোডে পাল্টাতে হবে এবং অ্যাক্টিভিটি PiP মোডে থাকাকালীন UI এলিমেন্ট লুকানো আছে এবং ভিডিও প্লেব্যাক চলছে কিনা তা নিশ্চিত করতে হবে।
সিস্টেমের বেছে নেওয়া স্ক্রিনের সবচেয়ে উপরের লেয়ারের কোনও একটি কোণে PiP উইন্ডো দেখা যায়।
এছাড়াও, Android 14 (API লেভেল ৩৪) বা তার পরবর্তী ভার্সনে চলে এমন মানানসই Android TV OS ডিভাইসে PiP কাজ করে। অনেক মিল থাকলেও, টিভিতে PiP ব্যবহার করার সময় অতিরিক্ত কিছু বিষয় বিবেচনা করতে হয়।
ব্যবহারকারীরা কীভাবে PiP উইন্ডোর সাথে ইন্টার্যাক্ট করতে পারবেন
ব্যবহারকারীরা PiP উইন্ডোটি অন্য কোনও লোকেশনে টেনে নিয়ে যেতে পারবেন। Android 12 থেকে শুরু করে, ব্যবহারকারীরা এগুলিও করতে পারবেন:
ফুল-স্ক্রিন টগল, বন্ধ করার বোতাম, সেটিংস বোতাম এবং আপনার অ্যাপের মাধ্যমে প্রদান করা কাস্টম অ্যাকশন (যেমন, প্লে কন্ট্রোল) দেখতে উইন্ডোতে একবার ট্যাপ করুন।
বর্তমান PiP সাইজ এবং সর্বাধিক বা সর্বনিম্ন PiP সাইজের মধ্যে টগল করতে উইন্ডোতে ডবল-ট্যাপ করুন—যেমন, বড় করা উইন্ডোতে ডবল-ট্যাপ করলে সেটি ছোট হয়ে যায় এবং এর উল্টোটাও হয়।
উইন্ডোটি বাঁদিকে বা ডানদিকে টেনে এনে স্ট্যাশ করুন। উইন্ডো আনস্ট্যাশ করতে, স্ট্যাশ করা উইন্ডোর দৃশ্যমান অংশে ট্যাপ করুন অথবা এটি টেনে বের করুন।
'পিঞ্চ-টু-জুম' ব্যবহার করে PiP উইন্ডো ছোট বড় করুন।
বর্তমান অ্যাক্টিভিটি PiP মোডে প্রবেশ করলে আপনার অ্যাপ নিয়ন্ত্রণ করে। এখানে কিছু উদাহরণ দেওয়া হল:
ব্যবহারকারী হোম বোতামে ট্যাপ করলে বা সোয়াইপ করে হোমে গেলে, কোনও অ্যাক্টিভিটি PiP মোডে প্রবেশ করতে পারে। ব্যবহারকারী একই সময়ে অন্য অ্যাক্টিভিটি চালালেও, Google Maps এইভাবে দিকনির্দেশ দেখানো চালিয়ে যায়।
ব্যবহারকারী ভিডিও থেকে ফিরে এসে অন্য কন্টেন্ট ব্রাউজ করলে, আপনার অ্যাপ ভিডিওটিকে 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-তে পাল্টান
Android 12 থেকে শুরু করে, আপনি setAutoEnterEnabled ফ্ল্যাগ true-এ সেট করে
আপনার অ্যাক্টিভিটি PiP মোডে পরিবর্তন করতে পারবেন। এই সেটিংয়ের মাধ্যমে, onUserLeaveHint-এ enterPictureInPictureMode()-কে
স্পষ্টভাবে কল না করেই, প্রয়োজন অনুযায়ী কোনও অ্যাক্টিভিটি
অটোমেটিক PiP মোডে পাল্টে যায়। এবং এর ফলে
আরও মসৃণ ট্রানজিশন প্রদান করার অতিরিক্ত সুবিধা পাওয়া যায়। বিস্তারিত জানতে, জেসচার নেভিগেশন থেকে PiP মোডে ট্রানজিশন আরও মসৃণ করুন দেখুন।
আপনি Android 11 বা তার আগের কোনও ভার্সন টার্গেট করলে, PiP মোডে পাল্টাতে কোনও অ্যাক্টিভিটিকে অবশ্যই
enterPictureInPictureMode() কল করতে হবে। যেমন, ব্যবহারকারী অ্যাপের UI-তে নির্দিষ্ট বোতামে ক্লিক করলে,
নিম্নলিখিত কোডটি অ্যাক্টিভিটি PiP মোডে পরিবর্তন করে:
override fun onActionClicked(action: Action) {
if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
activity?.enterPictureInPictureMode()
return
}
}
আপনি এমন লজিক অন্তর্ভুক্ত করতে চাইতে পারেন যা ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে
কোনও অ্যাক্টিভিটিকে PiP মোডে পরিবর্তন করে। যেমন, অ্যাপ নেভিগেট করার সময় ব্যবহারকারী হোম বা সাম্প্রতিক বোতাম প্রেস করলে,
Google Maps, PiP মোডে পাল্টে যায়। আপনি
onUserLeaveHint() ওভাররাইড করে এই কেসটি ধরতে পারবেন:
override fun onUserLeaveHint() {
if (iWantToBeInPipModeNow()) {
enterPictureInPictureMode()
}
}
সাজেস্ট করা হয়েছে: ব্যবহারকারীদের PiP ট্রানজিশনের আরও ভালো অভিজ্ঞতা প্রদান করুন
Android 12-এ ফুল-স্ক্রিন ও PiP উইন্ডোর মধ্যে অ্যানিমেটেড ট্রানজিশনে উল্লেখযোগ্য কসমেটিক উন্নতি করা হয়েছে। আমরা আপনাকে প্রযোজ্য সব পরিবর্তন প্রয়োগ করার জন্য বিশেষভাবে সাজেস্ট করি; আপনি একবার তা করে ফেললে, এইসব পরিবর্তন অটোমেটিক ফোল্ডেবল ও ট্যাবলেটের মতো বড় স্ক্রিনে স্কেল হয়ে যায় এবং এর জন্য আর কোনও কাজ করতে হয় না।
আপনার অ্যাপে প্রযোজ্য আপডেট না থাকলে, PiP ট্রানজিশন এখনও কাজ করে, তবে অ্যানিমেশনগুলি কম পালিশ করা হয়। যেমন, ফুল-স্ক্রিন থেকে PiP মোডে ট্রানজিশন করার সময়, ট্রানজিশন সম্পূর্ণ হওয়ার আগে PiP উইন্ডো অদৃশ্য হয়ে যেতে পারে এবং ট্রানজিশন সম্পূর্ণ হলে আবার দেখা যেতে পারে।
এইসব পরিবর্তনের মধ্যে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত।
- জেসচার নেভিগেশন থেকে PiP মোডে ট্রানজিশন আরও মসৃণ করা
- PiP মোডে প্রবেশ করা এবং বেরিয়ে আসার জন্য সঠিক
sourceRectHintসেট করা - ভিডিও ছাড়া অন্যান্য কন্টেন্টের জন্য নির্বিঘ্নে ছোট বড় করার সুবিধা বন্ধ করা হচ্ছে
একটি মসৃণ ট্রানজিশন অভিজ্ঞতা সক্ষম করার জন্য একটি রেফারেন্স হিসাবে Android Kotlin PictureInPicture নমুনা দেখুন।
জেসচার নেভিগেশন থেকে PiP মোডে ট্রানজিশন আরও মসৃণ করুন
Android 12 থেকে শুরু করে, setAutoEnterEnabled ফ্ল্যাগটি জেসচার নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও কন্টেন্টে ট্রানজিশন করার জন্য অনেক বেশি
মসৃণ অ্যানিমেশন প্রদান করে—যেমন, ফুলস্ক্রিন থেকে হোমে সোয়াইপ করার সময়।
এই পরিবর্তন করতে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
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].
PictureInPictureParams-এর সাথে আপ-টু-ডেটsetPictureInPictureParams-কে কল করুন। অ্যাপটিonUserLeaveHintকলব্যাকের জন্য অপেক্ষা করে না (যেমনটি Android 11-এ করত)।যেমন, আপনি হয়ত প্রথম প্লেব্যাক এবং পরবর্তী যেকোনও প্লেব্যাকে
setPictureInPictureParamsকল করতে চাইবেন, যদি অ্যাস্পেক্ট রেশিও পরিবর্তন করা হয়।setAutoEnterEnabled(false)-এ কল করুন, তবে শুধুমাত্র প্রয়োজন হলে। যেমন, বর্তমান প্লেব্যাক পজ করা থাকলে, আপনি হয়ত PiP-তে যেতে চাইবেন না।
PiP মোডে প্রবেশ করা ও বেরিয়ে আসার জন্য সঠিক sourceRectHint সেট করুন
Android 8.0-এ PiP-এর সূচনা থেকে, setSourceRectHint
অ্যাক্টিভিটির সেই অংশকে নির্দেশ করে যা ছবির-মধ্যে-ছবিতে
ট্রানজিশনের পরে দেখা যায়—যেমন, ভিডিও প্লেয়ারে ভিডিও ভিউ বাউন্ড।
Android 12-এর সাথে, PiP মোডে প্রবেশ এবং প্রস্থান করার সময় সিস্টেমটি অনেক মসৃণ অ্যানিমেশন প্রয়োগ করতে sourceRectHint ব্যবহার করে।
PiP মোডে প্রবেশ করা ও বেরিয়ে আসার জন্য sourceRectHint সঠিকভাবে সেট করতে:
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)
- প্রয়োজন হলে, সিস্টেম এক্সিট ট্রানজিশন শুরু করার আগে
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()
)
}
}
ভিডিও নয় এমন কন্টেন্টের জন্য সিমলেস রিসাইজিং বন্ধ করুন
Android 12-এ setSeamlessResizeEnabled ফ্ল্যাগ যোগ করা হয়েছে, যা PiP উইন্ডোতে ভিডিও নয় এমন কন্টেন্ট ছোট বড় করার সময় অনেক বেশি
স্মুথ ক্রস-ফেডিং অ্যানিমেশন
প্রদান করে। আগে, PiP উইন্ডোতে ভিডিও নয় এমন কন্টেন্ট ছোট বড় করার সময়
ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারত।
ভিডিও কন্টেন্টের জন্য নির্বিঘ্নে ছোট বড় করার সুবিধা চালু করতে:
setPictureInPictureParams(PictureInPictureParams.Builder()
.setSeamlessResizeEnabled(true)
.build())
PiP চলাকালীন UI ম্যানেজ করা
অ্যাক্টিভিটি যখন 'ছবির-মধ্যে-ছবি' (PiP) মোডে প্রবেশ করে বা বেরিয়ে আসে, তখন সিস্টেম
Activity.onPictureInPictureModeChanged() বা
Fragment.onPictureInPictureModeChanged() কল করে।
Android 15-এ এমন পরিবর্তন করা হয়েছে যার ফলে PiP মোডে প্রবেশ করার সময় আরও মসৃণ ট্রানজিশন নিশ্চিত করা যায়। এটি সেইসব অ্যাপের ক্ষেত্রে সুবিধাজনক যেগুলির প্রধান UI-এর উপরে UI এলিমেন্ট ওভারলে করা থাকে, যা PiP-তে যায়।
ডেভেলপাররা onPictureInPictureModeChanged() কলব্যাক ব্যবহার করে
লজিক নির্ধারণ করেন যা ওভারলে করা UI এলিমেন্টের দৃশ্যমানতা টগল করে। PiP-তে প্রবেশ বা বের হওয়ার অ্যানিমেশন সম্পূর্ণ হলে এই কলব্যাক ট্রিগার হয়। Android 15 থেকে শুরু করে, PictureInPictureUiState ক্লাসে একটি নতুন স্টেট অন্তর্ভুক্ত করা হয়েছে।
এই নতুন UI স্টেট সহ, Android 15-কে টার্গেট করা অ্যাপ, PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথেই
isTransitioningToPip()-এর সাথে
Activity#onPictureInPictureUiStateChanged() কলব্যাক ইনভোক করা হয়েছে কিনা তা লক্ষ্য করে। এমন অনেক UI এলিমেন্ট আছে যা PiP মোডে অ্যাপের জন্য প্রাসঙ্গিক নয়, যেমন, সাজেশন, আসন্ন ভিডিও, রেটিং ও শীর্ষকের মতো তথ্য সহ ভিউ বা লেআউট। অ্যাপটি 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.
}
}
অপ্রাসঙ্গিক UI এলিমেন্টের (PiP উইন্ডোর জন্য) এই দ্রুত দৃশ্যমানতা টগল, একটি মসৃণ এবং ফ্লিকার-মুক্ত PiP এন্টার অ্যানিমেশন নিশ্চিত করতে সাহায্য করে।
অ্যাক্টিভিটির UI এলিমেন্ট আবার আঁকার জন্য এইসব কলব্যাক ওভাররাইড করুন। মনে রাখবেন যে, PiP মোডে আপনার অ্যাক্টিভিটি ছোট উইন্ডোতে দেখানো হয়। অ্যাপ PiP মোডে থাকলে ব্যবহারকারীরা আপনার অ্যাপের UI এলিমেন্টের সাথে ইন্টার্যাক্ট করতে পারবেন না এবং ছোট UI এলিমেন্টের বিবরণ দেখতে অসুবিধা হতে পারে। মিনিমাল UI সহ ভিডিও প্লেব্যাক অ্যাক্টিভিটি ব্যবহারকারীকে সবচেয়ে ভালো অভিজ্ঞতা প্রদান করে।
আপনার অ্যাপকে PiP-এর জন্য কাস্টম অ্যাকশন প্রদান করতে হলে, এই পৃষ্ঠায় কন্ট্রোল যোগ করুন দেখুন। আপনার অ্যাক্টিভিটি PiP-তে প্রবেশ করার আগে অন্যান্য UI এলিমেন্ট সরিয়ে দিন এবং আপনার অ্যাক্টিভিটি আবার ফুল স্ক্রিন হয়ে গেলে সেগুলি ফিরিয়ে আনুন।
কন্ট্রোল যোগ করুন
ব্যবহারকারী উইন্ডোর মেনু খুললে PiP উইন্ডো কন্ট্রোল দেখাতে পারে (মোবাইল ডিভাইসে উইন্ডোতে ট্যাপ করে অথবা টিভির রিমোট থেকে মেনু বেছে নিয়ে)।
কোনও অ্যাপে অ্যাক্টিভ মিডিয়া সেশন থাকলে, প্লে, পজ, পরবর্তী ও পূর্ববর্তী কন্ট্রোল দেখা যাবে।
এছাড়াও, আপনি PiP মোডে প্রবেশ করার আগে
PictureInPictureParams.Builder.setActions()-এর সাথে
PictureInPictureParams তৈরি করে স্পষ্টভাবে কাস্টম অ্যাকশন নির্দিষ্ট করতে পারেন
এবং আপনি যখন
enterPictureInPictureMode(android.app.PictureInPictureParams) বা
setPictureInPictureParams(android.app.PictureInPictureParams) ব্যবহার করে PiP মোডে প্রবেশ করেন তখন প্যারামিটার পাস করতে পারেন। সাবধান
থাকুন। আপনি getMaxNumPictureInPictureActions()-এর বেশি যোগ করার চেষ্টা করলে,
আপনি শুধু সর্বাধিক সংখ্যা পাবেন।
PiP-তে ভিডিও প্লেব্যাক চালিয়ে যাওয়া
আপনার অ্যাক্টিভিটি PiP-তে পাল্টে গেলে, সিস্টেম অ্যাক্টিভিটিকে পজ করা অবস্থায়
রাখে এবং অ্যাক্টিভিটির onPause() পদ্ধতিকে কল করে। PiP মোডে ট্রানজিশন করার সময় অ্যাক্টিভিটি পজ করা হলে, ভিডিও প্লেব্যাক
পজ করা উচিত নয় এবং এর পরিবর্তে ভিডিও চালানো চালিয়ে যেতে হবে।
Android 7.0 (API লেভেল ২৪) এবং তার পরবর্তী ভার্সনে, সিস্টেম আপনার অ্যাক্টিভিটির 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)
বিবেচনায় রাখার মতো আরও জিনিস
কম RAM থাকা ডিভাইসে 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 অ্যাক্টিভিটি সেই অনুযায়ী আপডেট হওয়া উচিত।
অতিরিক্ত স্যাম্পেল কোড
Kotlin-এ লেখা স্যাম্পেল অ্যাপ ডাউনলোড করতে, Android PictureInPicture Sample (Kotlin) দেখুন।