অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) থেকে শুরু করে, অ্যান্ড্রয়েড পিকচার-ইন-পিকচার (পিআইপি) মোডে কার্যকলাপ চালু করার অনুমতি দেয়। পিআইপি হল একটি বিশেষ ধরণের মাল্টি-উইন্ডো মোড যা বেশিরভাগ সময় ভিডিও প্লেব্যাকের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীকে অ্যাপগুলির মধ্যে নেভিগেট করার সময় বা মূল স্ক্রিনে কন্টেন্ট ব্রাউজ করার সময় স্ক্রিনের কোণে পিন করা একটি ছোট উইন্ডোতে ভিডিও দেখতে দেয়।
পিন করা ভিডিও ওভারলে উইন্ডো প্রদানের জন্য PiP Android 7.0-এ উপলব্ধ মাল্টি-উইন্ডো API ব্যবহার করে। আপনার অ্যাপে PiP যোগ করতে, আপনাকে PiP সমর্থন করে এমন কার্যকলাপগুলি নিবন্ধন করতে হবে, প্রয়োজন অনুসারে আপনার কার্যকলাপ PiP মোডে স্যুইচ করতে হবে এবং নিশ্চিত করতে হবে যে UI উপাদানগুলি লুকানো আছে এবং কার্যকলাপ PiP মোডে থাকা অবস্থায় ভিডিও প্লেব্যাক চলতে থাকে।
পিআইপি উইন্ডোটি স্ক্রিনের সবচেয়ে উপরের স্তরে, সিস্টেম দ্বারা নির্বাচিত একটি কোণে প্রদর্শিত হয়।
PiP Android 14 (API লেভেল 34) বা তার পরবর্তী ভার্সনে চলমান সামঞ্জস্যপূর্ণ Android TV OS ডিভাইসগুলিতেও সমর্থিত। যদিও অনেক মিল রয়েছে, টিভিতে PiP ব্যবহার করার সময় অতিরিক্ত বিবেচনার বিষয় রয়েছে।
ব্যবহারকারীরা কীভাবে PiP উইন্ডোর সাথে ইন্টারঅ্যাক্ট করতে পারেন
ব্যবহারকারীরা PiP উইন্ডোটি অন্য কোনও স্থানে টেনে আনতে পারেন। অ্যান্ড্রয়েড ১২ থেকে শুরু করে, ব্যবহারকারীরা এগুলিও করতে পারবেন:
আপনার অ্যাপ দ্বারা প্রদত্ত একটি পূর্ণ-স্ক্রিন টগল, একটি বন্ধ বোতাম, একটি সেটিংস বোতাম এবং কাস্টম অ্যাকশন (উদাহরণস্বরূপ, প্লে নিয়ন্ত্রণ) প্রদর্শন করতে উইন্ডোটিতে একবার ট্যাপ করুন।
বর্তমান 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"
...
আপনার কার্যকলাপ PiP-তে স্যুইচ করুন
অ্যান্ড্রয়েড ১২ থেকে শুরু করে, আপনি setAutoEnterEnabled ফ্ল্যাগটিকে true এ সেট করে আপনার অ্যাক্টিভিটি PiP মোডে স্যুইচ করতে পারেন। এই সেটিং এর মাধ্যমে, একটি অ্যাক্টিভিটি প্রয়োজন অনুসারে স্বয়ংক্রিয়ভাবে PiP মোডে স্যুইচ করে, onUserLeaveHint এ স্পষ্টভাবে enterPictureInPictureMode() কল না করেই। এবং এর অতিরিক্ত সুবিধা হল অনেক মসৃণ ট্রানজিশন প্রদান করা। বিস্তারিত জানার জন্য, জেসচার নেভিগেশন থেকে 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 } }
জাভা
@Override public void onActionClicked(Action action) { if (action.getId() == R.id.lb_control_picture_in_picture) { getActivity().enterPictureInPictureMode(); return; } ... }
আপনি এমন লজিক অন্তর্ভুক্ত করতে চাইতে পারেন যা ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে PiP মোডে কোনও কার্যকলাপ স্যুইচ করে। উদাহরণস্বরূপ, অ্যাপটি নেভিগেট করার সময় ব্যবহারকারী যদি হোম বা রিসেন্টস বোতাম টিপে ফেলেন তবে Google Maps PiP মোডে স্যুইচ করে। আপনি onUserLeaveHint() ওভাররাইড করে এই কেসটি ধরতে পারেন:
কোটলিন
override fun onUserLeaveHint() { if (iWantToBeInPipModeNow()) { enterPictureInPictureMode() } }
জাভা
@Override public void onUserLeaveHint () { if (iWantToBeInPipModeNow()) { enterPictureInPictureMode(); } }
প্রস্তাবিত: ব্যবহারকারীদের একটি মসৃণ PiP ট্রানজিশন অভিজ্ঞতা প্রদান করুন
অ্যান্ড্রয়েড ১২ ফুলস্ক্রিন এবং পিআইপি উইন্ডোর মধ্যে অ্যানিমেটেড ট্রানজিশনে উল্লেখযোগ্য সৌন্দর্যবর্ধক উন্নতি এনেছে। আমরা দৃঢ়ভাবে সমস্ত প্রযোজ্য পরিবর্তন বাস্তবায়নের সুপারিশ করছি; একবার আপনি এটি করে ফেললে, এই পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে কোনও প্রয়োজনীয় কাজ ছাড়াই ফোল্ডেবল এবং ট্যাবলেটের মতো বড় স্ক্রিনে স্কেল হবে।
যদি আপনার অ্যাপে প্রযোজ্য আপডেট অন্তর্ভুক্ত না থাকে, তাহলে PiP ট্রানজিশনগুলি এখনও কার্যকরী থাকে, কিন্তু অ্যানিমেশনগুলি কম পালিশ করা হয়। উদাহরণস্বরূপ, পূর্ণস্ক্রিন থেকে PiP মোডে রূপান্তরের ফলে রূপান্তরের সময় PiP উইন্ডোটি অদৃশ্য হয়ে যেতে পারে এবং রূপান্তরটি সম্পূর্ণ হওয়ার পরে এটি পুনরায় প্রদর্শিত হতে পারে।
এই পরিবর্তনগুলির মধ্যে নিম্নলিখিতগুলি জড়িত।
- জেসচার নেভিগেশন থেকে PiP মোডে রূপান্তরকে আরও মসৃণ করা
- PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক
sourceRectHintসেট করা হচ্ছে - ভিডিও নয় এমন কন্টেন্টের জন্য নির্বিঘ্নে আকার পরিবর্তন বন্ধ করা হচ্ছে
একটি মসৃণ রূপান্তর অভিজ্ঞতা সক্ষম করার জন্য রেফারেন্স হিসাবে Android Kotlin PictureInPicture নমুনাটি দেখুন।
জেসচার নেভিগেশনের মাধ্যমে PiP মোডে ট্রানজিশন আরও সহজ করুন
অ্যান্ড্রয়েড ১২ থেকে শুরু করে, setAutoEnterEnabled ফ্ল্যাগটি জেসচার নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও কন্টেন্টে রূপান্তরের জন্য অনেক মসৃণ অ্যানিমেশন প্রদান করে—উদাহরণস্বরূপ, ফুলস্ক্রিন থেকে হোমে সোয়াইপ করার সময়।
এই পরিবর্তনটি করতে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন এবং রেফারেন্সের জন্য এই নমুনাটি দেখুন:
PictureInPictureParams.Builderতৈরি করতেsetAutoEnterEnabledব্যবহার করুন:কোটলিন
setPictureInPictureParams(PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .setSourceRectHint(sourceRectHint) .setAutoEnterEnabled(true) .build())
জাভা
setPictureInPictureParams(new PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .setSourceRectHint(sourceRectHint) .setAutoEnterEnabled(true) .build());
আপ-টু-ডেট
PictureInPictureParamsব্যবহার করেsetPictureInPictureParamsতাড়াতাড়ি কল করুন। অ্যাপটিonUserLeaveHintকলব্যাকের জন্য অপেক্ষা করে না (যেমনটি Android 11-এ করা হত)।উদাহরণস্বরূপ, আপনি প্রথম প্লেব্যাকে
setPictureInPictureParamsকল করতে চাইতে পারেন এবং যদি আকৃতির অনুপাত পরিবর্তন করা হয় তবে পরবর্তী যেকোনো প্লেব্যাকে।setAutoEnterEnabled(false)কল করুন, তবে শুধুমাত্র যখন এটি প্রয়োজন। উদাহরণস্বরূপ, বর্তমান প্লেব্যাকটি যদি বিরতিযুক্ত অবস্থায় থাকে তবে আপনি সম্ভবত PiP এ প্রবেশ করতে চান না।
PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করুন
অ্যান্ড্রয়েড ৮.০-এ PiP প্রবর্তনের সাথে সাথে, setSourceRectHint পিকচার-ইন-পিকচারে রূপান্তরের পরে দৃশ্যমান কার্যকলাপের ক্ষেত্রটি নির্দেশ করে - উদাহরণস্বরূপ, একটি ভিডিও প্লেয়ারে ভিডিও ভিউ সীমা।
অ্যান্ড্রয়েড ১২-এর সাথে, সিস্টেমটি PiP মোডে প্রবেশ এবং প্রস্থান করার সময় অনেক মসৃণ অ্যানিমেশন বাস্তবায়নের জন্য sourceRectHint ব্যবহার করে।
PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য sourceRectHint সঠিকভাবে সেট করতে:
sourceRectHintহিসেবে সঠিক সীমানা ব্যবহার করেPictureInPictureParamsতৈরি করুন। আমরা ভিডিও প্লেয়ারে একটি লেআউট পরিবর্তন শ্রোতা সংযুক্ত করার পরামর্শ দিচ্ছি:কোটলিন
val mOnLayoutChangeListener = OnLayoutChangeListener { v: View?, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop: Int, newRight: Int, newBottom: Int -> val sourceRectHint = Rect() mYourVideoView.getGlobalVisibleRect(sourceRectHint) val builder = PictureInPictureParams.Builder() .setSourceRectHint(sourceRectHint) setPictureInPictureParams(builder.build()) } mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)
জাভা
private final View.OnLayoutChangeListener mOnLayoutChangeListener = (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight, newBottom) -> { final Rect sourceRectHint = new Rect(); mYourVideoView.getGlobalVisibleRect(sourceRectHint); final PictureInPictureParams.Builder builder = new 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() ) } }
জাভা
// Listener is called right after the user exits PiP but before animating. playerView.addOnLayoutChangeListener((v, 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. final Rect sourceRectHint = new Rect(); playerView.getGlobalVisibleRect(sourceRectHint); setPictureInPictureParams( new PictureInPictureParams.Builder() .setSourceRectHint(sourceRectHint) .build()); } });
ভিডিও নয় এমন কন্টেন্টের জন্য সিমলেস রিসাইজিং বন্ধ করুন
অ্যান্ড্রয়েড ১২-তে setSeamlessResizeEnabled ফ্ল্যাগ যুক্ত করা হয়েছে, যা PiP উইন্ডোতে নন-ভিডিও কন্টেন্টের আকার পরিবর্তন করার সময় অনেক মসৃণ ক্রস-ফেইডিং অ্যানিমেশন প্রদান করে। পূর্বে, PiP উইন্ডোতে নন-ভিডিও কন্টেন্টের আকার পরিবর্তন করলে বিরক্তিকর ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে।
ভিডিও কন্টেন্টের জন্য নির্বিঘ্নে আকার পরিবর্তন সক্ষম করতে:
কোটলিন
setPictureInPictureParams(PictureInPictureParams.Builder() .setSeamlessResizeEnabled(true) .build())
জাভা
setPictureInPictureParams(new PictureInPictureParams.Builder() .setSeamlessResizeEnabled(true) .build());
PiP এর সময় UI পরিচালনা করুন
যখন অ্যাক্টিভিটি Picture-in-Picture (PiP) মোডে প্রবেশ করে বা প্রস্থান করে, তখন সিস্টেম Activity.onPictureInPictureModeChanged() অথবা Fragment.onPictureInPictureModeChanged() কল করে।
অ্যান্ড্রয়েড ১৫ এমন পরিবর্তন আনে যা পিআইপি মোডে প্রবেশের সময় আরও মসৃণ রূপান্তর নিশ্চিত করে। এটি সেইসব অ্যাপের জন্য উপকারী যেগুলির মূল ইউআইয়ের উপরে ইউআই উপাদানগুলি ওভারলে করা থাকে, যা পিআইপিতে যায়।
ডেভেলপাররা onPictureInPictureModeChanged() কলব্যাক ব্যবহার করে লজিক সংজ্ঞায়িত করে যা ওভারলেড UI উপাদানগুলির দৃশ্যমানতা টগল করে। PiP এন্টার বা এক্সিট অ্যানিমেশন সম্পন্ন হলে এই কলব্যাকটি ট্রিগার হয়। Android 15 থেকে শুরু করে, PictureInPictureUiState ক্লাসে একটি নতুন অবস্থা অন্তর্ভুক্ত করা হয়।
এই নতুন UI অবস্থায়, Android 15-কে লক্ষ্য করে তৈরি অ্যাপগুলি PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথে isTransitioningToPip() দিয়ে Activity#onPictureInPictureUiStateChanged() কলব্যাকটি পর্যবেক্ষণ করে। PiP মোডে থাকাকালীন অনেক UI উপাদান প্রাসঙ্গিক নয়, উদাহরণস্বরূপ, ভিউ বা লেআউটে পরামর্শ, আসন্ন ভিডিও, রেটিং এবং শিরোনামের মতো তথ্য অন্তর্ভুক্ত থাকে। অ্যাপটি PiP মোডে গেলে, এই UI উপাদানগুলি লুকানোর জন্য onPictureInPictureUiStateChanged() কলব্যাক ব্যবহার করুন। যখন অ্যাপটি PiP উইন্ডো থেকে পূর্ণ স্ক্রিন মোডে যায়, তখন এই উপাদানগুলি আনহাইড করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে:
কোটলিন
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) { if (pipState.isTransitioningToPip()) { // Hide UI elements. } }
জাভা
@Override public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) { if (pipState.isTransitioningToPip()) { // Hide UI elements. } }
কোটলিন
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { if (isInPictureInPictureMode) { // Unhide UI elements. } }
জাভা
@Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { if (isInPictureInPictureMode) { // Unhide UI elements. } }
অপ্রাসঙ্গিক UI উপাদানগুলির (একটি PiP উইন্ডোর জন্য) এই দ্রুত দৃশ্যমানতা টগল একটি মসৃণ এবং ঝিকিমিকি-মুক্ত PiP এন্টার অ্যানিমেশন নিশ্চিত করতে সাহায্য করে।
অ্যাক্টিভিটির UI উপাদানগুলি পুনরায় অঙ্কন করতে এই কলব্যাকগুলি ওভাররাইড করুন। মনে রাখবেন যে, PiP মোডে, আপনার কার্যকলাপ একটি ছোট উইন্ডোতে দেখানো হয়। অ্যাপটি PiP মোডে থাকাকালীন ব্যবহারকারীরা আপনার অ্যাপের UI উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করতে পারবেন না এবং ছোট UI উপাদানগুলির বিবরণ দেখা কঠিন হতে পারে। ন্যূনতম UI সহ ভিডিও প্লেব্যাক কার্যকলাপগুলি সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা প্রদান করে।
যদি আপনার অ্যাপকে PiP-এর জন্য কাস্টম অ্যাকশন প্রদান করতে হয়, তাহলে এই পৃষ্ঠায় "কন্ট্রোল যোগ করুন" দেখুন। আপনার অ্যাক্টিভিটি PiP-তে প্রবেশ করার আগে অন্যান্য UI এলিমেন্টগুলি সরিয়ে ফেলুন এবং আপনার অ্যাক্টিভিটি আবার পূর্ণ স্ক্রিনে পরিণত হলে সেগুলি পুনরুদ্ধার করুন।
নিয়ন্ত্রণ যোগ করুন
ব্যবহারকারী যখন উইন্ডোর মেনু খোলেন (মোবাইল ডিভাইসে উইন্ডোতে ট্যাপ করে, অথবা টিভি রিমোট থেকে মেনু নির্বাচন করে) তখন PiP উইন্ডোটি নিয়ন্ত্রণ প্রদর্শন করতে পারে।
যদি কোনও অ্যাপে একটি সক্রিয় মিডিয়া সেশন থাকে, তাহলে প্লে, পজ, নেক্সট এবং পূর্ববর্তী নিয়ন্ত্রণগুলি প্রদর্শিত হবে।
আপনি PiP মোডে প্রবেশ করার আগে 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, do not pause playback. if (isInPictureInPictureMode) { // Continue playback. } else { // Use existing playback logic for paused activity behavior. } }
জাভা
@Override public void onPause() { // If called while in PiP mode, do not 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() ওভাররাইড করুন এবং নতুন ভিডিওটি পরিচালনা করুন, প্রয়োজনে বিদ্যমান যেকোনো ভিডিও প্লেব্যাক বন্ধ করুন।
সেরা অনুশীলন
কম RAM আছে এমন ডিভাইসে PiP অক্ষম করা থাকতে পারে। আপনার অ্যাপ PiP ব্যবহার করার আগে, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) এ কল করে নিশ্চিত করুন যে এটি উপলব্ধ আছে।
PiP এমন কার্যকলাপের জন্য তৈরি করা হয়েছে যেখানে পূর্ণ-স্ক্রিন ভিডিও চালানো হয়। আপনার কার্যকলাপ PiP মোডে স্যুইচ করার সময়, ভিডিও কন্টেন্ট ছাড়া অন্য কিছু দেখানো এড়িয়ে চলুন। আপনার কার্যকলাপ PiP মোডে প্রবেশ করলে ট্র্যাক করুন এবং UI উপাদানগুলি লুকান, যেমন PiP চলাকালীন UI পরিচালনায় বর্ণিত হয়েছে।
যখন কোনও কার্যকলাপ PiP মোডে থাকে, তখন ডিফল্টরূপে এটি ইনপুট ফোকাস পায় না। PiP মোডে থাকাকালীন ইনপুট ইভেন্টগুলি গ্রহণ করতে, MediaSession.setCallback() ব্যবহার করুন। setCallback() ব্যবহার সম্পর্কে আরও তথ্যের জন্য Display a Now Playing card দেখুন।
যখন আপনার অ্যাপটি PiP মোডে থাকে, তখন PiP উইন্ডোতে ভিডিও প্লেব্যাক অন্য অ্যাপের সাথে অডিও ব্যাঘাত ঘটাতে পারে, যেমন মিউজিক প্লেয়ার অ্যাপ বা ভয়েস সার্চ অ্যাপ। এটি এড়াতে, ভিডিও চালানো শুরু করার সময় অডিও ফোকাসের অনুরোধ করুন এবং অডিও ফোকাস পরিবর্তনের বিজ্ঞপ্তিগুলি পরিচালনা করুন, যেমনটি অডিও ফোকাস পরিচালনা করুন । PiP মোডে থাকাকালীন অডিও ফোকাস হারিয়ে যাওয়ার বিজ্ঞপ্তি পেলে, ভিডিও প্লেব্যাক থামান বা বন্ধ করুন।
যখন আপনার অ্যাপটি PiP-তে প্রবেশ করতে চলেছে, তখন মনে রাখবেন শুধুমাত্র উপরের অ্যাক্টিভিটিটি পিকচার-ইন-পিকচারে প্রবেশ করে। কিছু পরিস্থিতিতে যেমন মাল্টি-উইন্ডো ডিভাইসে, নীচের অ্যাক্টিভিটিটি এখন দেখানো হবে এবং PiP অ্যাক্টিভিটির পাশাপাশি আবার দৃশ্যমান হতে পারে। আপনার এই কেসটি সেই অনুযায়ী পরিচালনা করা উচিত, নীচের অ্যাক্টিভিটির জন্য onResume() অথবা onPause() কলব্যাক পাওয়া সহ। এটিও সম্ভব যে ব্যবহারকারী অ্যাক্টিভিটির সাথে ইন্টারঅ্যাক্ট করতে পারে। উদাহরণস্বরূপ, যদি আপনার ভিডিও তালিকার অ্যাক্টিভিটি প্রদর্শিত হয় এবং PiP মোডে ভিডিও অ্যাক্টিভিটি প্লে করা হয়, তাহলে ব্যবহারকারী তালিকা থেকে একটি নতুন ভিডিও নির্বাচন করতে পারেন এবং PiP অ্যাক্টিভিটি সেই অনুযায়ী আপডেট হওয়া উচিত।
অতিরিক্ত নমুনা কোড
কোটলিনে লেখা একটি নমুনা অ্যাপ ডাউনলোড করতে, Android PictureInPicture Sample (Kotlin) দেখুন।
