অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) মাল্টিটাস্কিং করার জন্য পিকচার-ইন-পিকচার (পিআইপি) এপিআই-তে কিছু বর্ধিতকরণ প্রবর্তন করেছে। অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) তে পিআইপি সাপোর্ট চালু হলেও, এটি অ্যান্ড্রয়েড টিভিতে ব্যাপকভাবে সমর্থিত ছিল না এবং অ্যান্ড্রয়েড ১৩ এর আগে গুগল টিভিতে মোটেও সমর্থিত ছিল না। টিভির জন্য মাল্টিটাস্কিং পিআইপি মোড ব্যবহার করে দুটি পৃথক অ্যাপ স্ক্রিনে সহাবস্থান করতে দেয়: একটি পূর্ণ স্ক্রিনে চলছে, দ্বিতীয়টি পিআইপি মোডে চলছে। এই দুটি মোডে চলমান অ্যাপের জন্য বিভিন্ন প্রয়োজনীয়তা রয়েছে।
ডিফল্ট আচরণ হল PiP অ্যাপটি পূর্ণ-স্ক্রিন অ্যাপটিকে ওভারলে করে। এটি স্ট্যান্ডার্ড অ্যান্ড্রয়েড পিকচার-ইন-পিকচার আচরণের মতোই।
মনে রাখবেন যে মাল্টিটাস্কিং ইন্টিগ্রেট করার সময়, আপনার অ্যাপ্লিকেশনটিকে টিভি অ্যাপের মানের নির্দেশিকা অনুসারে এর ব্যবহারের ধরণগুলি ঘোষণা করতে হবে।
আপনার অ্যাপটি PiP মোডে চালান
Android 14 (API লেভেল 34) বা তার বেশি ভার্সন চালিত টিভি ডিভাইসের জন্য, enterPictureInPictureMode() কল করে PiP মোডে আপনার অ্যাপটি চালান। Android এর পূর্ববর্তী ভার্সন চালিত টিভি ডিভাইসগুলি PiP মোড সমর্থন করে না।
PiP মোডে প্রবেশের জন্য একটি বোতামের লজিক কীভাবে বাস্তবায়ন করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:
কোটলিন
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) pictureInPictureButton.visibility = if (requireActivity().packageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { pictureInPictureButton.setOnClickListener { val aspectRatio = Rational(view.width, view.height) val params = PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .build() val result = requireActivity().enterPictureInPictureMode(params) } View.VISIBLE } else { View.GONE } }
জাভা
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (requireActivity().getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { pictureInPictureButton.setVisibility(View.VISIBLE); pictureInPictureButton.setOnClickListener(v -> { Rational aspectRatio = new Rational(view.getWidth(), view.getHeight()); PictureInPictureParams params = new PictureInPictureParams.Builder() .setAspectRatio(aspectRatio) .setTitle("My Streaming App") .setSubtitle("My On-Demand Content") .build(); Boolean result = requireActivity().enterPictureInPictureMode(params); }); } else { pictureInPictureButton.setVisibility(View.GONE); } }
ডিভাইসটিতে সিস্টেম বৈশিষ্ট্য FEATURE_PICTURE_IN_PICTURE থাকলেই কেবল অ্যাকশনটি যোগ করা হয়। এছাড়াও, যখন অ্যাকশনটি ট্রিগার করা হয়, তখন PiP মোডের অ্যাসপেক্ট রেশিওটি প্লে করা ভিডিওর অ্যাসপেক্ট রেশিওর সাথে মেলে সেট করা হয়।
এই PIP সাধারণত কী কাজে ব্যবহৃত হচ্ছে সে সম্পর্কে ব্যবহারকারীকে তথ্য দেওয়ার জন্য একটি শিরোনাম এবং সাবটাইটেল যোগ করতে ভুলবেন না।
PiP মোডে চলমান অ্যাপগুলির সাথে সহাবস্থান করুন
যখন আপনার অ্যাপটি পূর্ণস্ক্রিন অ্যাপ হিসেবে চলছে, তখন এটিকে PiP মোডে চলমান অন্যান্য অ্যাপের সাথে মানিয়ে নিতে হতে পারে।
Keep-clear API গুলি
কিছু ক্ষেত্রে, PiP অ্যাপটি পূর্ণস্ক্রিন অ্যাপের মধ্যে গুরুত্বপূর্ণ UI উপাদানগুলিকে ওভারলে করতে পারে। এটি কমাতে, কিছু Keep-Clear API রয়েছে যা অ্যাপগুলি গুরুত্বপূর্ণ UI উপাদানগুলিকে সনাক্ত করতে ব্যবহার করতে পারে যা ওভারলে করা উচিত নয়। সিস্টেমটি PiP উইন্ডোটি পুনঃস্থাপন করে এই উপাদানগুলিকে কভার করা এড়াতে অনুরোধগুলি মেনে নেওয়ার চেষ্টা করে।

কোনও ভিউ ওভারলে করা উচিত নয় তা নির্দিষ্ট করতে, নিম্নলিখিত উদাহরণের মতো আপনার XML লেআউটে preferKeepClear ব্যবহার করুন:
<TextView
android:id="@+id/important_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:preferKeepClear="true"
android:text="@string/app_name"/>
আপনি setPreferKeepClear() ব্যবহার করেও এটি প্রোগ্রাম্যাটিকভাবে করতে পারেন:
কোটলিন
private lateinit var binding: MyLayoutBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = MyLayoutBinding.inflate(layoutInflater) setContentView(binding.root) binding.importantText.isPreferKeepClear = true }
জাভা
private MyLayoutBinding binding; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.importantText.setPreferKeepClear(true); }
এমন সময় আসতে পারে যখন আপনাকে সম্পূর্ণ View পরিষ্কার রাখার প্রয়োজন হয় না, বরং এর একটি অংশই পরিষ্কার রাখতে হয়। setPreferKeepClearRects() ব্যবহার করে View এমন অঞ্চলগুলি নির্দিষ্ট করা যেতে পারে যেগুলি ওভারলে করা উচিত নয়। যেসব UI View নেটিভভাবে ব্যবহার করে না, যেমন Flutter, Jetpack Compose এবং WebView, তাদের উপ-বিভাগ থাকতে পারে যেগুলির অঞ্চলগুলি পরিষ্কার রাখতে হয়। এই APIটি সেইসব ক্ষেত্রে ব্যবহার করা যেতে পারে।
ব্যবহারের ধরণ
আপনার অ্যাপকে অবশ্যই com.google.android.tv.pip.category এর একটি মেটা-ডেটা মান অ্যাট্রিবিউট ঘোষণা করতে হবে যা পিকচার-ইন-পিকচার মোডের জন্য প্রাথমিক ধরণ বা ব্যবহারের ধরণগুলির সাথে সঙ্গতিপূর্ণ। যেকোনো <activity> যার android:supportsPictureInPicture="true" সেট আছে, তাকে নীচের টেবিল থেকে একটি প্রাসঙ্গিক মান সহ এই অ্যাট্রিবিউট ঘোষণা করতে হবে।
টিভিতে ছবিতে-মধ্যে-ছবি মোডে, যে ধরণের ব্যবহারের ধরণগুলি এই বিভাগগুলির মধ্যে পড়ে না, বিশেষ করে মিডিয়া সামগ্রীর কোনও প্লেব্যাক অনুমোদিত নয়।
| মূল্য | বিবরণ |
|---|---|
" communication " | যোগাযোগের ক্ষেত্রে ভিডিও বা ভয়েস কলের মতো ব্যবহার করা হয়। |
" smartHome " | স্মার্ট হোম ইন্টিগ্রেশন, যেমন সংযুক্ত ডোরবেল বা শিশুর মনিটর। |
" health " | স্বাস্থ্য ব্যবহারের ক্ষেত্রে, যেমন ফিটনেস ট্র্যাকিং বা স্বাস্থ্য পর্যবেক্ষণ। |
" ticker " | টিকার ব্যবহারের ক্ষেত্রে, যেমন লাইভ স্পোর্টস স্কোর বা সংবাদ এবং স্টক টিকার। |
একাধিক মান একটি উল্লম্ব বার ( | ) দ্বারা পৃথক করা হয়। উদাহরণস্বরূপ:
<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />