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

Android 14 (API ระดับ 34) มีการปรับปรุง API Picture-in-Picture (PIP) บางอย่างเพื่อให้ทำหลายอย่างพร้อมกันได้ แม้ว่าการรองรับ PIP จะเปิดตัวใน Android 8.0 (API ระดับ 26) แต่ก็ไม่ได้รับการรองรับอย่างกว้างขวางใน Android TV และไม่ได้รับการรองรับเลยใน Google TV ก่อน Android 13 การทำงานแบบมัลติทาสก์สำหรับทีวีใช้โหมด PIP เพื่อให้แอป 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

API ที่ต้องเว้นที่ว่าง

ในบางกรณี แอป PIP อาจซ้อนทับคอมโพเนนต์ UI ที่สำคัญภายใน แอปแบบเต็มหน้าจอ เพื่อลดปัญหานี้ มี 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" กรณีการใช้งานแถบเลื่อน เช่น คะแนนการแข่งขันกีฬาสด หรือแถบเลื่อนข่าวและหุ้น

คั่นค่าหลายค่าด้วยแถบแนวตั้ง (|) เช่น

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