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

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

ชัดเจน

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