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

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

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

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

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

Android 14 (API লেভেল ৩৪) বা তার পরবর্তী যেকোনও ভার্সনে চলছে এমন টিভি ডিভাইসের জন্য, enterPictureInPictureMode() কল করে PiP মোডে আপনার অ্যাপ চালান। Android-এর পুরনো ভার্সনে চলা TV ডিভাইসে 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 মোডে রান করা অন্যান্য অ্যাপের সাথে মানিয়ে নিতে হতে পারে।

কিপ-ক্লিয়ার 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 পরিষ্কার রাখতে হবে না, তবে শুধুমাত্র এর একটি অংশ। View-এর যেসব অঞ্চলে ওভারলে করা যাবে না, সেগুলি নির্দিষ্ট করতে setPreferKeepClearRects() ব্যবহার করা যেতে পারে। যেসব UI নেটিভভাবে View ব্যবহার করে না, যেমন Flutter, Jetpack Compose এবং WebView, সেগুলিতে উপ-বিভাগ থাকতে পারে যেগুলির জন্য অঞ্চলগুলি খালি রাখতে হবে। এইসব ক্ষেত্রে এই API ব্যবহার করা যেতে পারে।

ব্যবহারের ধরন

আপনার অ্যাপকে অবশ্যই com.google.android.tv.pip.category-এর মেটা-ডেটা ভ্যালু অ্যাট্রিবিউট ঘোষণা করতে হবে যা ছবির-মধ্যে-ছবি মোডের জন্য প্রাথমিক ধরন বা ব্যবহারের ধরনের সাথে সামঞ্জস্যপূর্ণ। android:supportsPictureInPicture="true" সেট করা আছে এমন যেকোনও <activity>-কে নিম্নলিখিত টেবিল থেকে প্রাসঙ্গিক ভ্যালু সহ এই অ্যাট্রিবিউট ঘোষণা করতে হবে।

এইসব বিভাগের মধ্যে পড়ে না এমন ব্যবহারের ধরন, বিশেষ করে মিডিয়া কন্টেন্টের যেকোনও প্লেব্যাক, টিভিতে ছবির-মধ্যে-ছবি মোডে চালানোর অনুমতি দেওয়া হয় না।

মান বর্ণনা
"communication" যোগাযোগের ক্ষেত্রে ব্যবহার, যেমন ভিডিও বা ভয়েস কল।
"smartHome" স্মার্ট হোম ইন্টিগ্রেশন, যেমন কানেক্ট করা ডোরবেল বা বেবি মনিটর।
"health" স্বাস্থ্য সংক্রান্ত ব্যবহারের ক্ষেত্র, যেমন ফিটনেস ট্র্যাকিং বা স্বাস্থ্য মনিটর করা।
"ticker" টিকার ব্যবহারের উদাহরণ, যেমন লাইভ স্পোর্টস স্কোর বা খবর এবং স্টক টিকার।

একাধিক ভ্যালু ভার্টিক্যাল বার (|) দিয়ে আলাদা করা হয়। যেমন:

<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />