Wielozadaniowość na telewizorze

Android 14 (poziom interfejsu API 34) wprowadza pewne ulepszenia interfejsy API obraz w obrazie (PIP) umożliwiające wielozadaniowość. Podczas gdy obraz w obrazie została wprowadzona w Androidzie 8.0 (poziom interfejsu API 26), obsługiwane na Androidzie TV, ale w ogóle nie są obsługiwane w Google TV przed Androidem; 13. Wielozadaniowość na telewizorze wykorzystuje tryb obrazu w pionie, aby umożliwić 2 z nich oddzielne aplikacje na ekranie: jedna działająca w całości a druga w trybie Obraz w obrazie. Istnieją różne wymagania dla aplikacji działających w jednym z tych trybów.

Domyślnie aplikacja PIP nakłada się na aplikację pełnoekranową. To jest działa tak samo jak w przypadku funkcji obraz w obrazie na Androidzie.

Pamiętaj, że przy integrowaniu funkcji wielozadaniowych aplikacja musi zadeklarować typów wykorzystania w zgodnie ze wskazówkami dotyczącymi jakości aplikacji na telewizory.

Uruchamianie aplikacji w trybie PIP

Na telewizorach z Androidem 14 (poziom interfejsu API 34) lub nowszym uruchom aplikację w trybie PIP. w trybie online, wywołując metodę enterPictureInPictureMode(). Wcześniejsze urządzenia telewizyjne Androida nie obsługują trybu obraz w obrazie.

Oto przykład implementacji funkcji logicznej przycisku Enter Tryb 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
        }
}

Java

@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);
    }
}

Działanie jest dodawane tylko wtedy, gdy urządzenie ma funkcję systemową FEATURE_PICTURE_IN_PICTURE Ponadto po wywołaniu działania format obrazu jest ustawiony tak, aby odpowiadał proporcjom odtworzonej przez grę.

Koniecznie dodaj tytuł i podpis, aby informacje dla użytkownika były dostępne. do czego zwykle służy ten widok PIP.

Współistniej z aplikacjami działającymi w trybie PIP

Gdy aplikacja działa w trybie pełnoekranowym, może wymagać dostosowania się do innych w przypadku aplikacji działających w trybie obrazu w obrazie.

Przejrzyste interfejsy API

W niektórych przypadkach aplikacja PIP może nakładać ważne komponenty interfejsu aplikacji pełnoekranowej. Aby temu zaradzić, istnieją interfejsy API utrzymujące jasny stan, które umożliwiają aplikacjom służą do identyfikowania kluczowych komponentów interfejsu, których nie należy nakładać. System stara się uwzględnić prośby, aby nie uwzględnić tych komponentów przez gdy zmienisz położenie okna obrazu w obrazie.

Pozostawiaj oczywiste

Aby wskazać, że widok nie powinien być nakładany, użyj preferKeepClear w Układ XML jak w tym przykładzie:

<TextView
    android:id="@+id/important_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:preferKeepClear="true"
    android:text="@string/app_name"/>

Możesz też to zrobić automatycznie za pomocą 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
}

Java

private MyLayoutBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = MyLayoutBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    binding.importantText.setPreferKeepClear(true);
}

Może się zdarzyć, że nie trzeba będzie podawać całego obszaru View, ale tylko jego część. setPreferKeepClearRects() może służyć do: określ regiony w elemencie View, które nie powinny być nałożone. Interfejsy, które nie używają Środowisko View, takie jak Flutter, Jetpack Compose i WebView, może mieć podsekcje, które wymagają zachowania przejrzystości regionów. Tego interfejsu API można używać w takich przypadkach.

Typy użycia

Aplikacja musi zadeklarować atrybut wartości metadanych o wartości com.google.android.tv.pip.category odpowiadający głównemu typowi lub rodzaje wykorzystania trybu obrazu w obrazie. Wszystkie <activity>, które ustawiono android:supportsPictureInPicture="true" powinien zadeklarować ten atrybut przy użyciu tagu odpowiednią wartość z tabeli poniżej.

Typy użytkowania, które nie należą do żadnej z tych kategorii, a w szczególności odtwarzania treści multimedialnych są niedozwolone w trybie obrazu w obrazie na telewizorze.

Wartość Opis
communication Przypadki użycia komunikacji, na przykład rozmowy wideo lub głosowe.
smartHome Integracje z inteligentnymi domami, takimi jak połączone dzwonki do drzwi czy elektroniczna niania.
health Przypadki użycia związane ze zdrowiem, na przykład do śledzenia aktywności fizycznej lub zdrowia.
ticker Przypadki użycia znacznika, np. wyniki sportowe na żywo, wiadomości i akcje giełdowe.

Kilka wartości jest rozdzielonych pionową kreską (|). Na przykład:

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