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

Android 14 (API ระดับ 34) มีการปรับปรุง API การแสดง ภาพซ้อนภาพ (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 ที่ไม่ได้ใช้ Views โดยกำเนิด เช่น 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" />