ทําหลายอย่างพร้อมกันบนทีวี

Android 14 (API ระดับ 34) มีการปรับปรุงบางอย่างใน API ภาพในภาพ (PiP) เพื่อรองรับการทำงานแบบหลายงานพร้อมกัน แม้ว่าจะมีการเปิดตัวการรองรับ PiP ใน Android 8.0 (API ระดับ 26) แต่ Android TV รองรับฟีเจอร์นี้ในวงจำกัด และ Google TV ก่อน Android 13 ไม่รองรับฟีเจอร์นี้เลย การทํางานหลายอย่างพร้อมกันสําหรับทีวีใช้โหมด PIP เพื่ออนุญาตให้แอป 2 แอปแสดงร่วมกันบนหน้าจอ โดยแอปหนึ่งทํางานแบบเต็มหน้าจอและแอปที่ 2 ทํางานในโหมด PIP แอปที่ทำงานในโหมดใดโหมดหนึ่งเหล่านี้มีข้อกำหนดที่แตกต่างกัน

ลักษณะการทำงานเริ่มต้นคือแอป PIP จะวางซ้อนบนแอปแบบเต็มหน้าจอ ซึ่งคล้ายกับลักษณะการทำงานมาตรฐานของภาพซ้อนภาพใน Android

โปรดทราบว่าเมื่อผสานรวมการทำงานแบบหลายงาน แอปพลิเคชันของคุณต้องประกาศประเภทการใช้งานตามหลักเกณฑ์ด้านคุณภาพของแอป TV

เรียกใช้แอปในโหมด PiP

สำหรับอุปกรณ์ทีวีที่ใช้ Android 14 (API ระดับ 34) ขึ้นไป ให้เรียกใช้แอปในโหมด PiP โดยเรียกใช้ enterPictureInPictureMode() อุปกรณ์ทีวีที่ใช้ Android เวอร์ชันเก่าไม่รองรับโหมด PiP

ต่อไปนี้เป็นตัวอย่างวิธีใช้ตรรกะของปุ่มเพื่อเข้าสู่โหมด 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);
    }
}

ระบบจะเพิ่มการดำเนินการก็ต่อเมื่ออุปกรณ์มีฟีเจอร์ของระบบ FEATURE_PICTURE_IN_PICTURE นอกจากนี้ เมื่อมีการเรียกใช้การดำเนินการ ระบบจะตั้งค่าสัดส่วนภาพของโหมด PIP ให้ตรงกับสัดส่วนภาพของวิดีโอที่เล่นอยู่

อย่าลืมใส่ชื่อและคำบรรยายเพื่อให้ข้อมูลแก่ผู้ใช้เกี่ยวกับการใช้งาน PIP นี้โดยทั่วไป

ทำงานร่วมกับแอปที่ทำงานในโหมด PiP ได้

เมื่อแอปทำงานเป็นแอปแบบเต็มหน้าจอ แอปอาจต้องปรับให้เหมาะกับแอปอื่นๆ ที่ทำงานในโหมด PIP

Keep-clear API

ในบางกรณี แอป PiP อาจวางซ้อนส่วนประกอบ UI ที่สำคัญภายในแอปแบบเต็มหน้าจอ เพื่อลดปัญหานี้ จึงมี Keep-Clear API ที่แอปสามารถใช้เพื่อระบุส่วนประกอบ UI ที่สำคัญซึ่งไม่ควรวางซ้อน ระบบจะพยายามปฏิบัติตามคำขอเพื่อหลีกเลี่ยงการบดบังองค์ประกอบเหล่านี้โดยการจัดตำแหน่งหน้าต่าง PiP ใหม่

Keep-Clear

หากต้องการระบุว่าไม่ควรวางซ้อนมุมมอง ให้ใช้ 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() ดังนี้

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

บางครั้งคุณอาจไม่จำเป็นต้องล้างข้อมูล View ทั้งหมด แต่ล้างเพียงบางส่วน คุณสามารถใช้ setPreferKeepClearRects() เพื่อระบุภูมิภาคของ View ที่ไม่ควรจะวางซ้อน UI ที่ไม่ได้ใช้ View โดยกำเนิด เช่น Flutter, Jetpack Compose และ WebView อาจมีหัวข้อย่อยที่ต้องไม่มีภูมิภาค คุณใช้ API นี้กับกรณีดังกล่าวได้

ประเภทการใช้งาน

แอปของคุณต้องประกาศแอตทริบิวต์ค่าข้อมูลเมตาของ com.google.android.tv.pip.category ที่สอดคล้องกับประเภทหลักหรือประเภทการใช้งานสำหรับโหมดภาพในภาพ <activity> ที่มีการตั้งค่า android:supportsPictureInPicture="true" ควรประกาศแอตทริบิวต์นี้ด้วยค่าที่เกี่ยวข้องจากตารางด้านล่าง

ระบบไม่อนุญาตให้ใช้ประเภทการใช้งานที่ไม่ได้อยู่ในหมวดหมู่เหล่านี้ในโหมดภาพซ้อนภาพบนทีวี โดยเฉพาะการเล่นเนื้อหาสื่อ

ค่า คำอธิบาย
"communication" กรณีการใช้งานการสื่อสาร เช่น วิดีโอคอลหรือการโทรด้วยเสียง
"smartHome" การผสานรวมสมาร์ทโฮม เช่น กริ่งประตูหรือกล้องดูเด็กที่เชื่อมต่อ
"health" กรณีการใช้งานด้านสุขภาพ เช่น การติดตามการออกกำลังกายหรือการตรวจสอบสุขภาพ
"ticker" Use Case ของทิกเกอร์ เช่น คะแนนการแข่งขันกีฬาแบบสดหรือข่าวและทิกเกอร์หุ้น

ค่าหลายค่าจะคั่นด้วยแท่งแนวตั้ง (|) ตัวอย่างเช่น

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