TV'de çoklu görev

Android 14 (API düzeyi 34), Pencere içinde pencere (PiP) API'leri sayesinde çoklu görev özelliğinden yararlanabilirsiniz. PIP 8.0 (API düzeyi 26) sürümünde destek kullanıma sunulduktan sonra yaygın olarak Android TV'de desteklenir ve Android öncesinde Google TV'de hiç desteklenmemektedir. 13. TV'de çoklu görev özelliği, PiP modunu kullanarak iki Ekranda bir arada bulunacak ayrı uygulamalar: tam olarak çalışan ve ikincisi PiP modunda çalışıyor. Her biri 100'den az gösterim alan uygulamalar için farklı gereksinimler vardır.

Varsayılan davranış, PiP uygulamasının tam ekran uygulamanın üzerine yerleştirilmesidir. Bu Standart Android pencere içinde pencere davranışıyla hemen hemen aynıdır.

Çoklu görev entegrasyonu sırasında uygulamanızın, kullanım türlerini TV uygulaması kalite yönergelerine uyun.

Uygulamanızı PiP modunda çalıştırma

Android 14 (API düzeyi 34) veya sonraki sürümleri çalıştıran TV cihazlarında uygulamanızı PiP'de çalıştırın moduna geçmek için enterPictureInPictureMode() numaralı telefonu arayın. Daha erken çalışan TV cihazları Android sürümleri PiP modunu desteklemiyor.

Burada, giriş yapmak için bir düğmenin mantığının nasıl uygulanacağına PiP modu:

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

İşlem yalnızca cihazda sistem özelliği varsa eklenir FEATURE_PICTURE_IN_PICTURE. Ayrıca, işlem tetiklendiğinde PiP modunun en boy oranı, gösterilen videonun en boy oranıyla eşleşecek şekilde ayarlandı oynandı.

Kullanıcıya bilgilerini vermek için bir başlık ve altyazı eklediğinizden emin olun kullanım amacına değineceğiz.

PiP modunda çalışan uygulamalarla birlikte kullanılabilir

Uygulamanız tam ekran uygulama olarak çalışırken diğer PiP modunda çalışan uygulamalar.

Net API'ler

Bazı durumlarda PiP uygulaması, tam ekran uygulama. Bu sorunu azaltmak için uygulamaların, gibi önemli kullanıcı arayüzü bileşenlerini tanımlamak için kullanılır. Sistem bu bileşenleri ele almamak için yapılan talepleri dikkate almaya PiP penceresini yeniden konumlandırıyoruz.

Açık Tutun

Bir görünümün yer paylaşımlı olmaması gerektiğini belirtmek içinpreferKeepClear XML düzeni:

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

Bu işlemi setPreferKeepClear() kullanarak programatik olarak da yapabilirsiniz:

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

Bütün bir View öğesini net tutmanız gerekmeyen zamanlar olabilir, ancak yalnızca bir kısmını oluşturuyor. setPreferKeepClearRects(), şu amaçlarla kullanılabilir: View bölgesinin üzerine yerleştirilmemesi gereken bölgelerini belirtin. Kullanılmayan kullanıcı arayüzleri View'lar (Flutter, Jetpack Compose ve WebView gibi) yerel olarak alt bölümlerin net bir şekilde belirtilmesini sağlar. Bu API bu tür durumlarda kullanılabilir.

Kullanım türleri

Uygulamanız şunun meta veri değeri özelliğini beyan etmelidir: Birincil türe karşılık gelen com.google.android.tv.pip.category veya pencere içinde pencere modunun kullanım türleri hakkında bilgi edinin. Ayarlanan tüm <activity> android:supportsPictureInPicture="true" bu özelliği bir alakalı değere bakın.

Bu kategorilerin hiçbirine uymayan kullanım türleri, özellikle medya içeriklerinin oynatılmasına, TV'de pencere içinde pencere modunda izin verilmez.

Değer Açıklama
"communication" İletişimle ilgili kullanım alanları (ör. görüntülü veya sesli aramalar).
"smartHome" Bağlı kapı zilleri veya bebek monitörü gibi akıllı ev entegrasyonları.
"health" Fitness takibi veya sağlık takibi gibi sağlıkla ilgili kullanım alanları.
"ticker" Hisse senedi kullanım alanları (ör. canlı spor karşılaşmalarının skorları veya haberler ve hisse senedi sembolleri).

Birden fazla değer bir dikey çubukla (|) ayrılır. Örnek:

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