چندوظیفه ای در تلویزیون

Android 14 (سطح API 34) برخی از پیشرفت‌ها را در APIهای تصویر در تصویر (PiP) معرفی می‌کند تا امکان انجام چند کار را فراهم کند. در حالی که پشتیبانی PiP در Android 8.0 (سطح API 26) معرفی شده بود، به طور گسترده در Android TV پشتیبانی نمی‌شد، و قبل از Android 13 اصلاً در Google TV پشتیبانی نمی‌شد. چندوظیفه‌ای برای تلویزیون از حالت PiP استفاده می‌کند تا به دو برنامه مجزا اجازه همزیستی را بدهد. صفحه نمایش: یکی در حال اجرا در تمام صفحه، با اجرای دوم در حالت PiP. برای برنامه هایی که در هر یک از این حالت ها اجرا می شوند، الزامات مختلفی وجود دارد.

رفتار پیش‌فرض این است که برنامه PiP روی برنامه تمام صفحه قرار می‌گیرد. این تقریباً مشابه رفتار استاندارد Android Photo-in-picture است.

توجه داشته باشید که هنگام ادغام چند وظیفه ای، برنامه شما باید انواع استفاده خود را مطابق با دستورالعمل های کیفیت برنامه تلویزیونی اعلام کند.

برنامه خود را در حالت 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 اجرا می شوند سازگار شود.

API های پاک نگه دارید

در برخی موارد، برنامه PiP ممکن است اجزای مهم رابط کاربری را در برنامه تمام صفحه پوشش دهد. برای کاهش این موضوع، APIهایی وجود دارند که برنامه‌ها می‌توانند از آن‌ها برای شناسایی مؤلفه‌های مهم رابط کاربری که نباید روی هم قرار گیرند، استفاده کنند. سیستم تلاش می‌کند با تغییر موقعیت پنجره PiP، درخواست‌ها را برای جلوگیری از پوشش دادن این مؤلفه‌ها رعایت کند.

Keep-Clear

برای تعیین اینکه یک نما نباید روی هم قرار گیرد، از preferKeepClear در طرح XML خود مانند مثال زیر استفاده کنید:

<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 استفاده کرد که نباید روی هم قرار گیرند. رابط‌های کاربری که از View به صورت بومی استفاده نمی‌کنند، مانند Flutter، Jetpack Compose، و WebView، ممکن است دارای بخش‌های فرعی باشند که نیاز به پاک نگه داشتن مناطق دارند. این API را می توان برای آن موارد استفاده کرد.

انواع استفاده

برنامه شما باید یک ویژگی ارزش فراداده com.google.android.tv.pip.category را اعلام کند که با نوع یا انواع استفاده اصلی برای حالت تصویر در تصویر مطابقت دارد. هر <activity> که android:supportsPictureInPicture="true" را تنظیم کرده است، باید این ویژگی را با مقدار مربوطه از جدول زیر اعلام کند.

انواع استفاده که در هیچ یک از این دسته بندی ها قرار نمی گیرند، به ویژه هر گونه پخش محتوای رسانه ای، در حالت تصویر در تصویر در تلویزیون مجاز نیستند.

ارزش توضیحات
" communication " ارتباطات از مواردی مانند تماس‌های ویدیویی یا صوتی استفاده می‌کنند.
" smartHome " ادغام خانه های هوشمند، مانند زنگ های متصل یا نمایشگر کودک.
" health " موارد استفاده از سلامت، مانند ردیابی تناسب اندام یا نظارت بر سلامت.
" ticker " موارد استفاده از Ticker، مانند نمرات ورزشی زنده یا اخبار و سهام.

چندین مقدار با یک نوار عمودی ( | ) از هم جدا می شوند. به عنوان مثال:

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