TV'de çoklu görev

Android 14 (API düzeyi 34), çoklu görev özelliğini etkinleştirmek için resimli pencere (PiP) API'lerinde bazı iyileştirmeler sunar. 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 için çoklu görev özelliği, ekranda iki ayrı uygulamanın birlikte var olmasına olanak tanımak için PiP modunu kullanır. Bunlardan biri tam ekranda, diğeri ise PiP modunda çalışır. 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 enterPictureInPictureMode() çağrısını yaparak uygulamanızı PiP modunda çalıştırın. Daha erken çalışan TV cihazları Android sürümleri PiP modunu desteklemiyor.

PiP moduna girmek için bir düğmenin mantığının nasıl uygulanacağına dair bir örnek aşağıda verilmiştir:

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 FEATURE_PICTURE_IN_PICTURE sistem özelliği varsa eklenir. Ayrıca işlem tetiklendiğinde PiP modunun en boy oranı, oynatılan videonun en boy oranıyla eşleşecek şekilde ayarlanır.

Kullanıcıya bu PIP'nin genel olarak ne amaçla kullanıldığı hakkında bilgi vermek için bir başlık ve altyazı eklediğinizden emin olun.

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

Uygulamanız tam ekran modunda çalışırken PIP modunda çalışan diğer uygulamalara uyum sağlaması gerekebilir.

Net API'ler

Bazı durumlarda PiP uygulaması, tam ekran uygulamadaki önemli kullanıcı arayüzü bileşenlerini örtebilir. Bu sorunu azaltmak için uygulamaların, örtülmemesi gereken önemli kullanıcı arayüzü bileşenlerini tanımlamak üzere kullanabileceği "clear" API'leri vardı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 örtüşmemesi gerektiğini belirtmek için XML düzeninizde aşağıdaki örnekte gösterildiği gibi preferKeepClear kullanın:

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

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

Bazen View öğesinin tamamını değil, yalnızca bir bölümünü temiz tutmanız gerekebilir. setPreferKeepClearRects(), şu amaçlarla kullanılabilir: View bölgesinin üzerine yerleştirilmemesi gereken bölgelerini belirtin. Flutter, Jetpack Compose ve WebView gibi View'leri doğal olarak kullanmayan kullanıcı arayüzlerinde, bölgelerin boş tutulması gereken alt bölümler olabilir. Bu API bu tür durumlarda kullanılabilir.

Kullanım türleri

Uygulamanız, pencere içinde pencere modunun birincil türüne veya türlerine karşılık gelen com.google.android.tv.pip.category meta veri değeri özelliği bildirmelidir. android:supportsPictureInPicture="true" ayarlanmış olan tüm <activity> öğeleri, bu özelliği aşağıdaki tablodaki ilgili bir değerle belirtmelidir.

Bu kategorilerin hiçbirine girmeyen kullanım türlerine (özellikle medya içeriği oynatma) TV'de pencere içinde pencere modunda izin verilmez.

Değer Açıklama
"communication" Görüntülü veya sesli aramalar gibi iletişim amaçlı kullanım alanları.
"smartHome" Bağlı kapı zilleri veya bebek monitörleri gibi akıllı ev entegrasyonları
"health" Fitness takibi veya sağlık takibi gibi sağlıkla ilgili kullanım alanları.
"ticker" Canlı spor skorları veya haberler ve hisse senedi akışları gibi akış kullanımı alanları.

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" />