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

اندروید ۱۴ (API سطح ۳۴) برخی پیشرفت‌ها را در APIهای تصویر در تصویر (PiP) معرفی می‌کند تا امکان چندوظیفگی را فراهم کند. در حالی که پشتیبانی از PiP در اندروید ۸.۰ (API سطح ۲۶) معرفی شد، اما به طور گسترده در اندروید تی‌وی پشتیبانی نمی‌شد و قبل از اندروید ۱۳ اصلاً در گوگل تی‌وی پشتیبانی نمی‌شد. چندوظیفگی برای تلویزیون از حالت PiP استفاده می‌کند تا به دو برنامه جداگانه اجازه دهد تا همزمان روی صفحه نمایش وجود داشته باشند: یکی در حالت تمام صفحه و دیگری در حالت PiP. برای برنامه‌هایی که در هر یک از این حالت‌ها اجرا می‌شوند، الزامات متفاوتی وجود دارد.

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

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

برنامه خود را در حالت PiP اجرا کنید

برای دستگاه‌های تلویزیونی که اندروید ۱۴ (سطح API ۳۴) یا بالاتر را اجرا می‌کنند، برنامه خود را با فراخوانی تابع enterPictureInPictureMode() در حالت PiP اجرا کنید. دستگاه‌های تلویزیونی که نسخه‌های قبلی اندروید را اجرا می‌کنند، از حالت 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 های Keep-clear

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

پاک نگه دارید

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