টিভিতে মাল্টিটাস্কিং

মাল্টিটাস্কিংয়ের সুবিধা দিতে Android 14 (API লেভেল ৩৪) পিকচার-ইন-পিকচার (PiP) API-তে কিছু উন্নত ফিচার নিয়ে এসেছে। Android 8.0 (API লেভেল 26)-এ PiP সাপোর্ট চালু করা হলেও, Android TV-তে এটি ব্যাপকভাবে সাপোর্ট করা হয় না এবং Android 13-এর আগে Google TV-তে এটি একেবারেই সাপোর্ট করে না। টিভিতে মাল্টিটাস্কিংয়ের জন্য PIP মোড ব্যবহার করা হয় যাতে স্ক্রিনে দুটি আলাদা অ্যাপ একসাথে চলতে পারে: একটি ফুল স্ক্রিনে এবং দ্বিতীয়টি PIP মোডে চলে। এইসব মোডের যেকোনও একটিতে চলা অ্যাপের জন্য আলাদা আলাদা প্রয়োজনীয়তা আছে।

ডিফল্ট আচরণ হল, PiP অ্যাপটি ফুল-স্ক্রিন অ্যাপের উপরে ওভারলে করে। এটি স্ট্যান্ডার্ড Android পিকচার-ইন-পিকচার আচরণের মতোই।

মনে রাখবেন, মাল্টিটাস্কিং ইন্টিগ্রেট করার সময়, আপনার অ্যাপ্লিকেশনকে অবশ্যই টিভি অ্যাপের কোয়ালিটি সংক্রান্ত নির্দেশিকা ব্যবহারের ধরন ঘোষণা করতে হবে।

PiP মোডে আপনার অ্যাপ রান করানো

Android 14 (API লেভেল 34) বা এর পরের যেকোনও ভার্সনে চলে এমন টিভি ডিভাইসের জন্য, enterPictureInPictureMode() কল করে PiP মোডে আপনার অ্যাপ চালান। Android-এর আগের ভার্সনে চলা টিভি ডিভাইসে PiP মোড কাজ করে না।

PiP মোডে ঢোকার জন্য বোতামের লজিক কীভাবে প্রয়োগ করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:

Kotlin

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 কম্পোনেন্ট ওভারলে করতে পারে। এটি কমাতে, কিছু API আছে যেগুলি অ্যাপ ব্যবহার করে গুরুত্বপূর্ণ UI কম্পোনেন্ট শনাক্ত করতে পারে যেগুলি ওভারলে করা উচিত নয়। সিস্টেম এইসব কম্পোনেন্ট ঢেকে দেওয়া এড়াতে অনুরোধ মেনে চলার চেষ্টা করে। এটি PiP উইন্ডোকে অন্য জায়গায় সরিয়ে দেয়।

গুরুত্বপূর্ণ UI কম্পোনেন্ট যাতে ঢেকে না যায় সেই জন্য PiP উইন্ডো পজিশন করা
ছবি ১. গুরুত্বপূর্ণ 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() ব্যবহার করে প্রোগ্রাম্যাটিক উপায়ে এটি করতে পারবেন:

Kotlin

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-এর এমন অঞ্চল নির্দিষ্ট করা যেতে পারে যেগুলি ওভারলে করা উচিত নয়। Flutter, Jetpack Compose ও WebView-এর মতো UI-তে Views নেটিভ হিসেবে ব্যবহার করা হয় না। এগুলিতে সাব-সেকশন থাকতে পারে যেগুলিতে অঞ্চল পরিষ্কার রাখতে হয়। এইসব ক্ষেত্রে এই 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" />