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

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

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

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

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

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

পরিষ্কার রাখো

একটি দৃশ্যকে ওভারলেড করা উচিত নয় তা নির্দিষ্ট করতে, নিম্নলিখিত উদাহরণের মতো আপনার 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 ব্যবহার করে না, যেমন ফ্লাটার, জেটপ্যাক কম্পোজ এবং ওয়েবভিউ, সেগুলির উপ-বিভাগ থাকতে পারে যেগুলির অঞ্চলগুলি পরিষ্কার রাখা প্রয়োজন৷ এই 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" />