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

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

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

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

আপনার অ্যাপটি PiP মোডে চালান

অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণে চালিত টিভি ডিভাইসগুলির জন্য, enterPictureInPictureMode() কল করে আপনার অ্যাপটি 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 অ্যাপটি ফুলস্ক্রিন অ্যাপের মধ্যে থাকা গুরুত্বপূর্ণ 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 খালি রাখার প্রয়োজন হবে না, বরং শুধু এর একটি অংশ খালি রাখলেই চলবে। View এর যে অংশগুলো ওভারলে করা উচিত নয়, তা নির্দিষ্ট করার জন্য setPreferKeepClearRects() ব্যবহার করা যেতে পারে। যেসব UI স্বাভাবিকভাবে View ব্যবহার করে না, যেমন ফ্লাটার, জেটপ্যাক কম্পোজ এবং ওয়েবভিউ, সেগুলোতে এমন উপ-বিভাগ থাকতে পারে যেগুলোর কিছু অংশ খালি রাখা প্রয়োজন। এই 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" />