Multitasking di TV

Android 14 (level API 34) memperkenalkan beberapa peningkatan pada API picture-in-picture (PiP) untuk memungkinkan multitasking. Saat PiP diperkenalkan di Android 8.0 (API level 26), tapi tidak didukung di Android TV, dan tidak didukung sama sekali di Google TV sebelum Android 13. Multitasking untuk TV menggunakan mode PiP untuk memungkinkan dua orang aplikasi yang terpisah untuk berdampingan di layar: satu aplikasi berjalan penuh layar dengan satu detik dalam mode PiP. Ada persyaratan yang berbeda untuk aplikasi yang berjalan dalam salah satu mode ini.

Perilaku defaultnya adalah aplikasi PiP menempatkan aplikasi layar penuh. Ini adalah sama dengan perilaku picture-in-picture Android standar.

Perhatikan bahwa saat mengintegrasikan multitasking, aplikasi Anda harus mendeklarasikan jenis penggunaan di sesuai dengan pedoman kualitas aplikasi TV.

Menjalankan aplikasi dalam mode PiP

Untuk perangkat TV yang menjalankan Android 14 (level API 34) atau yang lebih baru, jalankan aplikasi dalam PiP dengan memanggil enterPictureInPictureMode(). Perangkat TV yang berjalan lebih awal versi Android tidak mendukung mode PiP.

Berikut adalah contoh cara menerapkan logika tombol untuk masuk Mode 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);
    }
}

Tindakan hanya ditambahkan jika perangkat memiliki fitur sistem FEATURE_PICTURE_IN_PICTURE Selain itu, saat tindakan dipicu, rasio aspek mode PiP disetel agar cocok dengan rasio aspek video yang sedang yang dimainkan.

Pastikan untuk menambahkan judul dan subtitel untuk memberikan informasi kepada pengguna tentang tujuan penggunaan PIP ini.

Berdampingan dengan aplikasi yang berjalan dalam mode PiP

Saat aplikasi Anda berjalan sebagai aplikasi layar penuh, aplikasi tersebut mungkin perlu beradaptasi dengan aplikasi yang berjalan dalam mode PiP.

API yang tetap dihapus

Dalam beberapa kasus, aplikasi PiP dapat menempatkan komponen UI yang penting dalam aplikasi layar penuh. Untuk mengurangi hal ini, ada API yang selalu jelas yang dapat digunakan aplikasi untuk mengidentifikasi komponen UI penting yang tidak boleh ditempatkan. Sistem berupaya memenuhi permintaan agar tidak mencakup komponen ini dengan mengubah posisi jendela PiP.

Tetap Hapus

Untuk menentukan bahwa tampilan tidak boleh ditempatkan di overlay, gunakan preferKeepClear di Tata letak XML seperti dalam contoh berikut:

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

Anda juga dapat melakukannya secara terprogram menggunakan 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);
}

Terkadang Anda mungkin tidak perlu menjaga keseluruhan View tetap jelas, tetapi hanya sebagian dari bagian itu. setPreferKeepClearRects() dapat digunakan untuk menentukan wilayah View yang tidak boleh ditempatkan. UI yang tidak menggunakan View secara native, seperti Flutter, Jetpack Compose, dan WebView, mungkin memiliki sub-bagian yang membutuhkan region yang tetap jelas. API ini dapat digunakan untuk kasus tersebut.

Jenis penggunaan

Aplikasi Anda harus mendeklarasikan atribut nilai meta-data com.google.android.tv.pip.category yang sesuai dengan jenis utama atau jenis penggunaan untuk mode picture-in-picture. Setiap <activity> yang telah ditetapkan android:supportsPictureInPicture="true" harus mendeklarasikan atribut ini dengan nilai yang relevan dari tabel di bawah ini.

Jenis penggunaan yang tidak termasuk dalam salah satu kategori tersebut, khususnya pemutaran konten media, tidak diizinkan dalam mode picture-in-picture di TV.

Nilai Deskripsi
"communication" Kasus penggunaan komunikasi, seperti panggilan video atau suara.
"smartHome" Integrasi smart home, seperti bel pintu yang terhubung atau alat pemantau bayi.
"health" Kasus penggunaan kesehatan, seperti pelacakan kebugaran atau pemantauan kesehatan.
"ticker" Kasus penggunaan ticker, seperti skor olahraga live atau berita dan ticker saham.

Beberapa nilai dipisahkan oleh garis vertikal (|). Contoh:

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