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