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