ฟีเจอร์และ API ของ Android 8.0

Android 8.0 (API ระดับ 26) เปิดตัวฟีเจอร์ต่างๆ มากมาย ฟีเจอร์และความสามารถใหม่ๆ สำหรับผู้ใช้และนักพัฒนาซอฟต์แวร์ เอกสารนี้ไฮไลต์สิ่งใหม่ๆ สำหรับนักพัฒนาซอฟต์แวร์

และอย่าลืมชำระเงิน การเปลี่ยนแปลงลักษณะการทำงานของ Android 8.0 เพื่อดูข้อมูลเกี่ยวกับส่วนที่แพลตฟอร์มมีการเปลี่ยนแปลง อาจส่งผลกระทบต่อแอปของคุณ

ประสบการณ์ของผู้ใช้

โหมดการแสดงภาพซ้อนภาพ

การแสดงภาพซ้อนภาพใน Android 8.0

Android 8.0 (API ระดับ 26) อนุญาตให้เปิดกิจกรรมได้ใน โหมดการแสดงภาพซ้อนภาพ (PIP) PIP คือ โหมดหลายหน้าต่างประเภทพิเศษ ใช้สำหรับการเล่นวิดีโอเป็นส่วนใหญ่ เดิมโหมด PIP มีให้ใช้งานสำหรับ Android TV เท่านั้น Android 8.0 ทำให้ฟีเจอร์นี้พร้อมใช้งาน บนอุปกรณ์ Android อื่นๆ

เมื่อกิจกรรมอยู่ในโหมด PIP กิจกรรมนั้นจะอยู่ในสถานะหยุดชั่วคราว แต่ แสดงเนื้อหาต่อ ด้วยเหตุนี้ คุณจึงควรตรวจสอบว่าแอปของคุณ ไม่หยุดการเล่นชั่วคราวใน onPause() เครื่องจัดการ แต่ควรหยุดวิดีโอใน onStop() ชั่วคราวแทน แล้วเล่นต่อใน onStart() สำหรับข้อมูลเพิ่มเติม โปรดดู หลายหน้าต่าง วงจร

หากต้องการระบุว่ากิจกรรมของคุณสามารถใช้โหมด PIP ได้ ให้ตั้งค่า android:supportsPictureInPicture เป็นจริงในไฟล์ Manifest (สำหรับ Android 8.0 เป็นต้นไป PIP ไม่ต้องใช้ แอตทริบิวต์ไฟล์ Manifest android:resizeableActivity อย่างไรก็ตาม คุณต้องตั้งค่า android:resizeableActivity เป็น "จริง" หากกิจกรรมของคุณรองรับ โหมดหลายหน้าต่าง)

Android 8.0 (API ระดับ 26) เปิดตัวออบเจ็กต์ใหม่ ซึ่งก็คือ PictureInPictureParams ที่คุณส่งไปยังเมธอด PIP เพื่อระบุว่ากิจกรรมควรทำงานอย่างไร เมื่ออยู่ในโหมด PIP ออบเจ็กต์นี้ระบุพร็อพเพอร์ตี้ เช่น สัดส่วนภาพที่ต้องการของกิจกรรม

วิธีการ PIP ที่มีอยู่ตามที่อธิบายไว้ใน การเพิ่ม ตอนนี้คุณสามารถใช้การแสดงภาพซ้อนภาพได้แล้ว ใช้ในอุปกรณ์ Android ทุกเครื่อง ไม่ใช่แค่ Android TV นอกจากนี้ Android 8.0 มีวิธีการสนับสนุนดังต่อไปนี้ โหมด PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): วางกิจกรรมในโหมดการแสดงภาพซ้อนภาพ สัดส่วนภาพของกิจกรรม และการตั้งค่าอื่นๆ ที่ระบุโดย args หากมีฟิลด์ ใน args ว่างเปล่า ระบบจะใช้ค่าที่ตั้งไว้ในครั้งถัดไปที่คุณ ที่ชื่อ Activity.setPictureInPictureParams()

    กิจกรรมที่ระบุจะวางไว้ที่มุมของหน้าจอ ส่วนที่เหลือของ หน้าจอมีกิจกรรมก่อนหน้าอยู่บนหน้าจอ กิจกรรมที่เข้าสู่โหมด PIP จะเข้าสู่สถานะหยุดชั่วคราว แต่ยังคงอยู่ เลย หากผู้ใช้แตะกิจกรรม PIP ระบบจะแสดงเมนูสำหรับ โต้ตอบกับผู้ใช้ กิจกรรมที่ไม่มีการแตะเข้าถึงกิจกรรมในขณะที่ ในสถานะ PIP

  • Activity.setPictureInPictureParams(): อัปเดตการตั้งค่าการกำหนดค่า PIP ของกิจกรรม หากกิจกรรมคือ ขณะนี้อยู่ในโหมด PIP การตั้งค่าจะได้รับการอัปเดต วิธีนี้เป็นประโยชน์หาก สัดส่วนการแสดงผลของกิจกรรม หากกิจกรรมไม่ได้อยู่ในโหมด PIP ระบบจะใช้การตั้งค่าการกำหนดค่าเหล่านี้โดยไม่คำนึงถึง enterPictureInPictureMode() เมธอดที่คุณเรียกใช้

การแจ้งเตือน

ใน Android 8.0 (API ระดับ 26) เราได้ออกแบบการแจ้งเตือนใหม่เพื่อ มอบวิธีการจัดการลักษณะการทำงานของการแจ้งเตือนที่ง่ายและสอดคล้องกันมากขึ้น และการตั้งค่า การเปลี่ยนแปลงเหล่านี้ประกอบด้วย

    เมนูการกดค้างสำหรับการแจ้งเตือนใน Android 8.0 (API ระดับ 26)

    ผู้ใช้สามารถกดไอคอนตัวเปิดแอปค้างไว้เพื่อดู ใน Android 8.0

  • ช่องทางการแจ้งเตือน: Android 8.0 เปิดตัว ช่องทางการแจ้งเตือนที่ให้คุณสร้างช่องทางที่ผู้ใช้กำหนดเองได้ สำหรับการแจ้งเตือนแต่ละประเภทที่ต้องการแสดง อินเทอร์เฟซผู้ใช้อ้างอิง ให้กับช่องทางการแจ้งเตือนเป็นหมวดหมู่การแจ้งเตือน เพื่อดูวิธี ในการใช้ช่องทางการแจ้งเตือน โปรดดู การจัดการ ช่องทางการแจ้งเตือน
  • เครื่องหมายจุดแสดงการแจ้งเตือน: Android 8.0 มีการรองรับการแสดงผล จุด หรือป้ายต่างๆ บนไอคอนตัวเปิดแอป จุดแจ้งเตือนจะแสดง มีการแจ้งเตือนที่ผู้ใช้ยังไม่ได้ปิดหรือดำเนินการ หากต้องการดูวิธีใช้งานเครื่องหมายจุดแสดงการแจ้งเตือน โปรดดู การแจ้งเตือน ป้าย
  • การปิดการแจ้งเตือนชั่วคราว: ผู้ใช้สามารถเลื่อนการแจ้งเตือนได้ ซึ่งทำให้การแจ้งเตือนหายไป ช่วงเวลาหนึ่งก่อนที่จะปรากฏขึ้นอีกครั้ง การแจ้งเตือนจะปรากฏขึ้นอีกครั้งพร้อม ความสำคัญในระดับเดียวกับที่โฆษณาปรากฏครั้งแรก แอปสามารถนำออกหรืออัปเดตได้ การแจ้งเตือนที่เลื่อน แต่การอัปเดตการแจ้งเตือนที่เลื่อนจะไม่ทำให้ ให้แสดงขึ้นอีกครั้ง
  • ระยะหมดเวลาของการแจ้งเตือน: คุณสามารถตั้งระยะหมดเวลาได้เมื่อสร้าง การแจ้งเตือนโดยใช้ setTimeoutAfter() คุณสามารถใช้วิธีนี้เพื่อระบุระยะเวลาหลังจากที่การแจ้งเตือน ควรถูกยกเลิก หากจำเป็น คุณสามารถยกเลิกการแจ้งเตือนก่อน ผ่านระยะหมดเวลาที่ระบุไว้แล้ว
  • การตั้งค่าการแจ้งเตือน: คุณโทรหาได้ setSettingsText() เพื่อตั้งค่าข้อความที่ปรากฏเมื่อคุณสร้างลิงก์ไปยัง จากการแจ้งเตือนโดยใช้ Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES Intent ระบบอาจให้ส่วนเสริมต่อไปนี้โดยตั้งใจที่จะกรอง การตั้งค่าที่แอปของคุณต้องแสดงต่อผู้ใช้: EXTRA_CHANNEL_ID NOTIFICATION_TAG และ NOTIFICATION_ID
  • การปิดการแจ้งเตือน: ผู้ใช้จะปิดการแจ้งเตือนด้วยตนเองได้ และ นำแอปออกแบบเป็นโปรแกรมได้ คุณกำหนดเวลาที่การแจ้งเตือนได้ ถูกปิด และเหตุใดจึงปิดโดยใช้ onNotificationRemoved() จาก ชั้นเรียนNotificationListenerService
  • สีพื้นหลัง: คุณสามารถตั้งค่าและเปิดใช้สีพื้นหลังสำหรับ การแจ้งเตือน คุณควรใช้ฟีเจอร์นี้ในการแจ้งเตือนสำหรับ งานที่ต้องทำต่อเนื่องซึ่งสำคัญมากต่อผู้ใช้ สำหรับ เช่น คุณสามารถตั้งค่าสีพื้นหลังสำหรับการแจ้งเตือนที่เกี่ยวข้องกับ เส้นทางการขับขี่ หรือการโทรที่ดำเนินการอยู่ คุณยังสามารถตั้งค่า สีพื้นหลังที่ต้องการโดยใช้ setColor() ดังนั้น อนุญาตให้คุณใช้ setColorized() เพื่อเปิดใช้การใช้สีพื้นหลังสำหรับการแจ้งเตือน
  • รูปแบบการรับส่งข้อความ: ใน Android 8.0 การแจ้งเตือนที่ใช้ การแสดงผลชั้นเรียนของ MessagingStyle เนื้อหาเพิ่มเติมในรูปแบบยุบได้ คุณควรใช้ MessagingStyle ชั้นเรียนสำหรับ การแจ้งเตือนที่เกี่ยวข้องกับการรับส่งข้อความ คุณยังสามารถใช้ addHistoricMessage() วิธีในการให้บริบทในการสนทนาด้วยการเพิ่ม ข้อความที่ผ่านมาไปจนถึงการแจ้งเตือนที่เกี่ยวข้องกับการรับส่งข้อความ

เฟรมเวิร์กการป้อนข้อความอัตโนมัติ

การสร้างบัญชี การเข้าสู่ระบบ และธุรกรรมผ่านบัตรเครดิตต้องใช้เวลาและมีแนวโน้มที่จะ ผู้ใช้อาจหงุดหงิดจากแอปที่ต้องใช้ประเภทเหล่านี้ได้ง่ายๆ งานซ้ำๆ ได้

Android 8.0 (API ระดับ 26) ทำการกรอกแบบฟอร์ม เช่น การเข้าสู่ระบบ และแบบฟอร์มบัตรเครดิต จะง่ายขึ้นด้วยการแนะนำกรอบการทำงานป้อนข้อความอัตโนมัติ แอปที่มีอยู่และแอปใหม่จะทํางานร่วมกับเฟรมเวิร์กการป้อนข้อความอัตโนมัติหลังจากที่ผู้ใช้เลือกใช้ ป้อนข้อความอัตโนมัติ

คุณอาจทำตามขั้นตอนบางอย่างเพื่อเพิ่มประสิทธิภาพการทำงานของแอปกับเฟรมเวิร์กนี้ สำหรับข้อมูลเพิ่มเติม โปรดดูภาพรวมเฟรมเวิร์กการป้อนข้อความอัตโนมัติ

แบบอักษรที่ดาวน์โหลดได้

Android 8.0 (API ระดับ 26) และ Android Support Library 26 ให้คุณขอแบบอักษรจาก แทนการรวมกลุ่มแบบอักษรลงใน APK หรือปล่อยให้ APK ดาวน์โหลดแบบอักษร ฟีเจอร์นี้ช่วยลดขนาด APK และเพิ่มแอป อัตราการติดตั้งสำเร็จ และอนุญาตให้แอปหลายแอปใช้แบบอักษรเดียวกันได้

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการดาวน์โหลดแบบอักษร โปรดดู แบบอักษรที่ดาวน์โหลดได้

แบบอักษรใน XML

Android 8.0 (API ระดับ 26) แนะนำฟีเจอร์ใหม่คือ แบบอักษรใน XML ซึ่ง ช่วยให้คุณใช้แบบอักษรเป็นแหล่งข้อมูลได้ ซึ่งหมายความว่าไม่จำเป็นต้องรวมกลุ่มแบบอักษร เป็นเนื้อหา แบบอักษรได้รับการคอมไพล์ในไฟล์ R และระบบจะ อยู่ในระบบเป็นทรัพยากร จากนั้นคุณสามารถเข้าถึงแบบอักษรเหล่านี้ด้วย ความช่วยเหลือสำหรับทรัพยากรประเภทใหม่ font

Support Library 26 รองรับฟีเจอร์นี้อย่างเต็มรูปแบบในอุปกรณ์ ที่ใช้ API เวอร์ชัน 14 ขึ้นไป

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการใช้แบบอักษรเป็นทรัพยากรและการดึงข้อมูลแบบอักษรของระบบ ดูแบบอักษรใน XML

ปรับขนาด TextView อัตโนมัติ

Android 8.0 (API ระดับ 26) ช่วยให้คุณกำหนดขนาดของข้อความเพื่อขยายหรือ ย่อโดยอัตโนมัติตามขนาดของ TextView ซึ่งหมายความว่า ปรับขนาดข้อความบนหน้าจอต่างๆ หรือกับเนื้อหาแบบไดนามิกได้ง่ายขึ้น ดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับขนาด TextView อัตโนมัติใน Android 8.0 ได้ ดูการปรับขนาด TextView อัตโนมัติ

ไอคอนแบบปรับอัตโนมัติ

Android 8.0 (API ระดับ 26) เปิดตัวไอคอน Launcher แบบปรับอัตโนมัติ ไอคอนแบบปรับอัตโนมัติรองรับภาพ และสามารถแสดงรูปร่างได้หลากหลายในอุปกรณ์รุ่นต่างๆ ดูวิธีการ สร้างไอคอนแบบปรับอัตโนมัติ โปรดดูไอคอนแบบปรับอัตโนมัติ

การจัดการสี

ตอนนี้นักพัฒนาซอฟต์แวร์ Android ของแอปสร้างภาพถ่ายสามารถใช้ประโยชน์จากอุปกรณ์ใหม่ได้แล้ว ที่สามารถแสดงผลสีได้กว้าง เพื่อแสดงขอบเขตแบบกว้าง รูปภาพ แอปจะต้องเปิดใช้ Flag ในไฟล์ Manifest (ตามกิจกรรม) และโหลดบิตแมปด้วยโปรไฟล์สีแบบกว้างแบบฝัง (AdobeRGB Pro Photo RGB, DCI-P3 ฯลฯ)

WebView API

Android 8.0 มี API มากมายที่จะช่วยคุณจัดการ ออบเจ็กต์ WebView ที่แสดงเนื้อหาเว็บในแอป API เหล่านี้ซึ่งช่วยปรับปรุงความเสถียรและความปลอดภัยของแอป ได้แก่ ดังต่อไปนี้:

  • API เวอร์ชัน
  • API การเรียกดูที่ปลอดภัยของ Google
  • API แฮนเดิลการสิ้นสุด
  • API ความสำคัญของตัวแสดงผล

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ API เหล่านี้ได้ที่ การจัดการ WebView

ตอนนี้คลาส WebView มี Google Safe Browsing API เพื่อช่วยยกระดับความปลอดภัยแล้ว ในการท่องเว็บ สำหรับข้อมูลเพิ่มเติม โปรดดู Google Safe Browsing API

การปักหมุดทางลัดและวิดเจ็ต

Android 8.0 (API ระดับ 26) เปิดตัวการปักหมุดทางลัดในแอปและ วิดเจ็ต ในแอป คุณสามารถสร้างทางลัดและวิดเจ็ตที่ปักหมุดไว้สำหรับ Launcher ที่รองรับ ขึ้นอยู่กับการให้สิทธิ์จากผู้ใช้

สำหรับข้อมูลเพิ่มเติม โปรดดู การปักหมุดทางลัดและวิดเจ็ต แนะนำฟีเจอร์

สัดส่วนภาพสูงสุดของหน้าจอ

Android 8.0 (API ระดับ 26) มีการเปลี่ยนแปลงวิธีกําหนดค่าสัดส่วนภาพสูงสุดของแอป

อันดับแรก Android 8.0 ขอแนะนำ maxAspectRatio ซึ่งคุณ สามารถใช้ตั้งค่าสัดส่วนภาพสูงสุดของแอป นอกจากนี้ ใน Android 8.0 ขึ้นไป สัดส่วนภาพสูงสุดเริ่มต้น คือสัดส่วนภาพดั้งเดิมของอุปกรณ์ที่แอปทำงานอยู่

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการประกาศสัดส่วนภาพสูงสุด โปรดดู การรองรับหน้าจอหลายขนาด

การสนับสนุนหลายจอภาพ

แพลตฟอร์มนี้มีการปรับปรุงประสิทธิภาพเพิ่มขึ้นตั้งแต่ Android 8.0 (API ระดับ 26) รองรับการแสดงผลหลายจอ หากกิจกรรมรองรับโหมดหลายหน้าต่าง และ กำลังทำงานในอุปกรณ์ที่มีหลายจอแสดงผล ผู้ใช้สามารถย้ายกิจกรรมได้ จากจอแสดงผลหนึ่งไปยังอีกจอแสดงผลหนึ่ง เมื่อแอปเปิดกิจกรรม สามารถระบุว่าจะให้กิจกรรมใดทำงานบนจอแสดงผลใด

หมายเหตุ: หากกิจกรรมรองรับ โหมดหลายหน้าต่าง Android 8.0 จะเปิดใช้โดยอัตโนมัติ แบบหลายจอภาพสำหรับกิจกรรมดังกล่าว คุณควรทดสอบแอปเพื่อให้ ว่าใช้งานได้อย่างเพียงพอในสภาพแวดล้อมแบบหลายจอแสดงผล

กิจกรรมหนึ่งๆ จะอยู่ในสถานะกลับมาทำงานอีกครั้งได้เพียงครั้งละ 1 รายการเท่านั้น แม้ว่า แอปมีหลายหน้าจอ กิจกรรมที่มีโฟกัสอยู่ในสถานะกลับมาทำงานอีกครั้ง กิจกรรมอื่นๆ ทั้งหมดที่มองเห็นได้จะหยุดชั่วคราว แต่ไม่ได้หยุด หากต้องการดูข้อมูลเพิ่มเติม ในวงจรกิจกรรมเมื่อกิจกรรมหลายรายการแสดงขึ้น ดูโหมดหลายหน้าต่าง วงจร

เมื่อผู้ใช้ย้ายกิจกรรมจากจอแสดงผลหนึ่งไปยังอีกจอแสดงผลหนึ่ง ระบบจะ ปรับขนาดกิจกรรมและแสดงการเปลี่ยนแปลงรันไทม์ตามความจำเป็น กิจกรรมของคุณ สามารถจัดการการเปลี่ยนแปลงการกำหนดค่าด้วยตนเอง หรือช่วยให้ระบบ ทำลายกระบวนการที่มีกิจกรรมของคุณ และสร้างขึ้นใหม่โดยใช้ สำหรับข้อมูลเพิ่มเติม โปรดดู การจัดการการกำหนดค่า การเปลี่ยนแปลง

ActivityOptions มีวิธีการสนับสนุนแบบใหม่ 2 วิธี จอแสดงผลหลายจอ:

setLaunchDisplayId()
ระบุว่ากิจกรรมใดควรแสดงเมื่อมีการเปิดตัว
getLaunchDisplayId()
แสดงหน้าจอเปิดปัจจุบันของกิจกรรม

adb shell ขยายเพื่อรองรับการแสดงผลหลายหน้าจอ ใช้คำสั่ง shell start เพื่อเริ่มกิจกรรมได้แล้ว และเพื่อระบุการแสดงผลเป้าหมายของกิจกรรม:

adb shell start <activity_name> --display <display_id>

ระยะขอบและระยะห่างจากขอบของเลย์เอาต์แบบรวม

Android 8.0 (API ระดับ 26) ทำให้คุณระบุสถานการณ์ที่ฝั่งตรงข้ามได้ง่ายขึ้น ขององค์ประกอบ View ใช้ระยะขอบหรือระยะห่างจากขอบเดียวกัน กล่าวอย่างเจาะจงคือ ตอนนี้คุณสามารถใช้แอตทริบิวต์ต่อไปนี้ใน XML ของเลย์เอาต์ได้แล้ว ไฟล์:

หมายเหตุ: หากคุณปรับแต่งตรรกะของแอปเป็น สนับสนุน ภาษาและวัฒนธรรม รวมถึงการกำหนดทิศทางข้อความ ควรคำนึงอยู่เสมอว่า จะไม่มีผลต่อค่าของ layout_marginStart layout_marginEnd paddingStart หรือ paddingEnd คุณสามารถตั้งค่าเหล่านี้ด้วยตนเองนอกเหนือจาก แอตทริบิวต์การออกแบบแนวตั้งและแนวนอนใหม่เพื่อสร้างลักษณะการทำงานของเลย์เอาต์ ซึ่งขึ้นอยู่กับทิศทางของข้อความ

การจับภาพเคอร์เซอร์

แอปบางแอป เช่น เกม, Remote Desktop และไคลเอ็นต์ระบบเสมือนจริง จะได้ประโยชน์จากการควบคุมเคอร์เซอร์เมาส์ การจับภาพตัวชี้เป็น ใน Android 8.0 (API ระดับ 26) ที่ให้การควบคุมดังกล่าวโดยส่งเหตุการณ์เมาส์ทั้งหมด ไปยังมุมมองที่โฟกัสในแอป

ตั้งแต่ Android 8.0 เป็นต้นไป View ในแอปจะขอได้ การบันทึกตัวชี้และกำหนด Listener เพื่อประมวลผลเหตุการณ์ตัวชี้ที่บันทึกไว้ ระบบจะซ่อนเคอร์เซอร์เมาส์ขณะอยู่ในโหมดนี้ มุมมองจะเผยแพร่การจับภาพตัวชี้ เมื่อไม่ต้องใช้ข้อมูลเมาส์อีก ระบบจะปล่อย การจับภาพตัวชี้เมื่อมุมมองสูญเสียโฟกัส เช่น เมื่อผู้ใช้เปิด แอปอื่น

สำหรับข้อมูลเกี่ยวกับวิธีใช้ฟีเจอร์นี้ในแอปของคุณ โปรดดู การจับภาพตัวชี้

หมวดหมู่ของแอป

Android 8.0 (API ระดับ 26) ช่วยให้แต่ละแอปประกาศหมวดหมู่ที่ตรงกับแอปนั้นๆ ได้ เมื่อมีความเกี่ยวข้อง หมวดหมู่เหล่านี้ใช้เพื่อจัดกลุ่มแอปที่คล้ายกัน วัตถุประสงค์หรือฟังก์ชันเมื่อนำเสนอต่อผู้ใช้ เช่น ในการใช้ข้อมูล การใช้งานแบตเตอรี่ หรือ การใช้พื้นที่เก็บข้อมูล คุณสามารถกำหนดหมวดหมู่สำหรับแอปได้โดยการตั้งค่า แอตทริบิวต์ android:appCategory ใน <application> ไฟล์ Manifest

Launcher ของ Android TV

Android 8.0 (API ระดับ 26) ประกอบด้วยฟีเจอร์ใหม่ที่เน้นเนื้อหา ประสบการณ์การใช้งานหน้าจอหลักของ Android TV ซึ่งใช้งานได้กับ ภาพอุปกรณ์จำลอง Android TV และอุปกรณ์ Nexus Player สำหรับ Android 8.0 หน้าจอหลักใหม่จะจัดระเบียบ เนื้อหาวิดีโอในแถวที่สอดคล้องกับช่อง ซึ่งแต่ละรายการจะมีรายการจากแอปใน ระบบ แอปสามารถเผยแพร่ได้หลายช่องทาง และผู้ใช้ก็สามารถกำหนดค่าช่องทางที่ต้องการเผยแพร่ได้ ต้องการดูบนหน้าจอหลัก หน้าจอหลักของ Android TV ยังมีแถว "แนะนำให้รับชม" ซึ่งก็คือ ป้อนข้อมูลของโปรแกรมจากแอป โดยอิงตามพฤติกรรมการดูของผู้ใช้ นอกจากนี้ แอปยังให้ ตัวอย่างวิดีโอ ซึ่งจะเล่นโดยอัตโนมัติเมื่อผู้ใช้โฟกัสโปรแกรม API สำหรับ การป้อนข้อมูลเกี่ยวกับช่องทางและโปรแกรมต่างๆ เป็นส่วนหนึ่งของ TvProvider API ซึ่งจัดจำหน่ายในฐานะ Android โมดูลไลบรารีการสนับสนุนที่ใช้ Android 8.0

ชุดแอนิเมชัน

ตั้งแต่ Android 8.0 (API ระดับ 26) เป็นต้นไป AnimatorSet API จะรองรับการค้นหาและการเล่นใน สลับกัน การกรอวิดีโอช่วยให้คุณกำหนดตำแหน่งของภาพเคลื่อนไหวที่ตั้งค่าเป็น ช่วงเวลาหนึ่ง การเล่นย้อนกลับจะมีประโยชน์หากแอปมีภาพเคลื่อนไหว เพื่อดูการดำเนินการที่เลิกทำได้ แทนที่จะกำหนดภาพเคลื่อนไหว 2 ภาพแยกกัน คุณก็สามารถเล่นชุดเดิมสลับกัน

การป้อนข้อมูลและการนำทาง

คลัสเตอร์การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์

หากกิจกรรมในแอปใช้ลำดับชั้นการแสดงผลที่ซับซ้อน เช่น กิจกรรมในลำดับชั้น รูปที่ 2 ลองจัดกลุ่มองค์ประกอบ UI ให้เป็นคลัสเตอร์เพื่อให้ง่ายขึ้น การไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ ผู้ใช้สามารถกด Meta+Tab หรือ Search+Tab ได้ อุปกรณ์ Chromebook สำหรับการไปยังส่วนต่างๆ จากคลัสเตอร์หนึ่งไปยังอีกคลัสเตอร์ ตัวอย่างที่ดีของ คลัสเตอร์ ได้แก่ แผงด้านข้าง แถบนำทาง พื้นที่เนื้อหาหลัก และองค์ประกอบ ซึ่งอาจมีองค์ประกอบย่อยหลายรายการ

วันที่ ตัวอย่างกิจกรรมที่มีคลัสเตอร์การนำทาง 5 คลัสเตอร์ที่ผู้ใช้
  สามารถนำทางโดยใช้ทางลัดของคลัสเตอร์การนำทางด้วยแป้นพิมพ์ คลัสเตอร์
  จะปรากฏในการจัดเรียง เช่น แผงด้านบน แผงด้านข้างทางซ้าย เนื้อหาหลัก
  พื้นที่ แผงด้านล่าง และปุ่มการทำงานแบบลอย
รูปที่ 2 กิจกรรมที่มีการนำทาง 5 รายการ คลัสเตอร์

วิธีสร้างองค์ประกอบ View หรือ ViewGroup คลัสเตอร์ ตั้งค่า android:keyboardNavigationCluster แอตทริบิวต์ให้กับ true ในไฟล์ XML สำหรับเลย์เอาต์ขององค์ประกอบ หรือส่ง true ลงใน setKeyboardNavigationCluster() ในตรรกะ UI ของแอป

หมายเหตุ: คลัสเตอร์จะซ้อนกันไม่ได้ แม้ว่าจะไม่ได้ซ้อนก็ตาม คลัสเตอร์อาจปรากฏในระดับต่างๆ ของลำดับชั้น หากคุณพยายาม คลัสเตอร์ Nest จะถือว่าแสดงเฉพาะรายการด้านบนสุด องค์ประกอบ ViewGroup รายการเป็นคลัสเตอร์

คุณตั้งค่ากำหนดคลัสเตอร์ในอุปกรณ์ที่มีหน้าจอสัมผัสได้ ออบเจ็กต์ ViewGroup รายการ android:touchscreenBlocksFocus องค์ประกอบให้กับ true ไปยัง อนุญาตการนำทางเฉพาะคลัสเตอร์เข้าและออกจากคลัสเตอร์นั้น หากคุณใช้วิธีนี้ การกำหนดค่าให้กับคลัสเตอร์ ผู้ใช้จะไม่สามารถใช้แป้น Tab หรือแป้นลูกศรเพื่อ ไปยังส่วนต่างๆ ของคลัสเตอร์หรือออกจากคลัสเตอร์ ผู้ใช้จะต้องกดการนำทางของคลัสเตอร์ การกดแป้นร่วมกันแทน

ดูโฟกัสเริ่มต้น

ใน Android 8.0 (API ระดับ 26) คุณสามารถกำหนด View ที่ควร รับโฟกัสหลังจากกิจกรรมที่สร้าง (ใหม่) กลับมาทำงานอีกครั้งและผู้ใช้กด แป้นนำทางด้วยแป้นพิมพ์ เช่น แป้น Tab วิธีใช้ "โฟกัสโดยค่าเริ่มต้น" นี้ ตั้งค่าองค์ประกอบ View android:focusedByDefault เป็น true ใน ไฟล์ XML การจัดวางที่มีองค์ประกอบ UI หรือส่งใน true ไปยัง setFocusedByDefault() ใน ตรรกะ UI ของแอป

เอาต์พุตเสียงพูด

กิจกรรมและบริการสามารถใช้อินสแตนซ์ของ TextToSpeech เพื่อพิมพ์ตามคำบอกและออกเสียงเนื้อหา เมื่อ Android 8.0 (API ระดับ 26) แอปของคุณสามารถรับข้อมูลเวลาที่แม่นยำมากขึ้น เกี่ยวกับเวลาที่เครื่องมืออ่านออกเสียงข้อความเริ่มพูดคำสังเคราะห์แต่ละคำ หากเครื่องมือให้ข้อมูลนี้ คุณใช้ฟังก์ชันนี้ได้ เพื่อเรียกความสนใจไปยังคำที่เจาะจงในขณะที่เครื่องมืออ่านออกเสียงข้อความพูด ให้พวกเขา

หากต้องการใช้การปรับปรุงเครื่องมืออ่านออกเสียงข้อความเหล่านี้ในแอป ให้ลงทะเบียน UtteranceProgressListener ในฐานะส่วนหนึ่งของ สำหรับขั้นตอนการลงทะเบียน โดยใส่เครื่องจัดการสำหรับ onRangeStart()

เครื่องมืออ่านออกเสียงข้อความ rangeStart()เพื่อบันทึก ช่วงเวลาที่มีการเล่นเสียงของข้อความช่วงหนึ่ง เพื่อเริ่มต้น เมื่อเสียงสำหรับช่วงข้อความดังกล่าวเริ่มเล่น onRangeStart() ของเมธอด จากนั้นแอปของคุณจะตอบกลับการเรียกกลับนี้ได้ เช่น ไฮไลต์ช่วงข้อความที่เกี่ยวข้องกับคำพูด

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตามความคืบหน้าในการเล่นการอ่านออกเสียงข้อความ เครื่องมือ โปรดดูคลาส UtteranceProgressListener ข้อมูลอ้างอิง

ระบบ

ตัวตรวจจับ StrictMode ใหม่

Android 8.0 (API ระดับ 26) เพิ่มตัวตรวจจับ StrictMode ใหม่ 3 รายการเพื่อช่วยระบุ ข้อบกพร่องที่อาจเกิดขึ้นในแอปของคุณ:

  • detectUnbufferedIo() จะตรวจพบเมื่อ แอปอ่านหรือเขียนข้อมูลโดยไม่มีการบัฟเฟอร์ ซึ่งอาจส่งผลกระทบอย่างมาก ด้านประสิทธิภาพ
  • detectContentUriWithoutPermission() จะ ตรวจจับเมื่อแอปของคุณลืมให้สิทธิ์แก่แอปอื่นโดยไม่ตั้งใจเมื่อ การเริ่มกิจกรรมนอกแอปของคุณ
  • detectUntaggedSockets() จะตรวจพบเมื่อ แอปของคุณการจราจรของข้อมูลในเครือข่ายโดยไม่ใช้ setThreadStatsTag(int) เพื่อติดแท็กการเข้าชมของคุณสำหรับการแก้ไขข้อบกพร่อง วัตถุประสงค์

ข้อมูลในแคช

Android 8.0 (API ระดับ 26) ให้คำแนะนำและลักษณะการทำงานที่ดีขึ้นเกี่ยวกับข้อมูลที่แคชไว้ ชิ้น ขณะนี้แอปจะได้รับโควต้าพื้นที่ดิสก์สำหรับข้อมูลที่แคชไว้ ตามที่ส่งคืนโดย getCacheQuotaBytes(UUID)

เมื่อระบบต้องการเพิ่มพื้นที่ว่างในดิสก์ ระบบจะเริ่มต้นด้วยการลบไฟล์ที่แคชไว้ออกจากแอป เป็นจำนวนที่เกินโควต้าที่จัดสรรไว้ ดังนั้นหากคุณเก็บข้อมูลที่แคชไว้ภายใต้ โควต้าที่จัดสรรแล้ว ไฟล์ที่แคชไว้จะเป็นไฟล์ล่าสุดบางส่วนในระบบที่จะล้างเมื่อ ตามความจำเป็น เมื่อระบบกำลังตัดสินใจว่าจะลบไฟล์ใดในแคชจากในแอป ระบบจะดำเนินการ ให้พิจารณาไฟล์ที่เก่าที่สุดก่อน (ตามที่กำหนดโดยเวลาที่แก้ไข)

นอกจากนี้ ยังมีลักษณะการทำงานใหม่ 2 แบบที่คุณสามารถเปิดใช้แบบต่อไดเรกทอรีเพื่อควบคุม วิธีที่ระบบเพิ่มพื้นที่ว่างในแคช

  • StorageManager.setCacheBehaviorAtomic() สามารถใช้เพื่อระบุ ไดเรกทอรีและเนื้อหาทั้งหมดควรถูกลบเป็นหน่วยอะตอมเดียว
  • setCacheBehaviorTombstone(File, boolean) สามารถใช้เพื่อระบุ แทนที่จะลบไฟล์ภายในไดเรกทอรี ไฟล์ควรถูกตัดทอนให้เหลือ 0 ไบต์ใน ความยาว โดยปล่อยให้ไฟล์ที่ว่างเปล่าเหมือนเดิม

สุดท้าย เมื่อคุณต้องการจัดสรรพื้นที่ดิสก์สำหรับไฟล์ขนาดใหญ่ ให้พิจารณาใช้ allocateBytes(FileDescriptor, long) API ซึ่งจะล้างโดยอัตโนมัติ ไฟล์ที่แคชไว้ของแอปอื่นๆ (ตามความจำเป็น) เพื่อให้เป็นไปตามคำขอของคุณ เมื่อตัดสินใจว่า อุปกรณ์มีพื้นที่ในดิสก์เพียงพอที่จะเก็บข้อมูลใหม่ การโทร getAllocatableBytes(UUID)แทนการใช้ getUsableSpace() เนื่องจากตัวเลือกแรกจะพิจารณาจากแคช ที่ระบบต้องการล้างในนามของคุณ

การแบ่งหน้าของผู้ให้บริการเนื้อหา

เราได้อัปเดตผู้ให้บริการเนื้อหาเพื่อให้รองรับการโหลด ชุดข้อมูลครั้งละ 1 หน้า ตัวอย่างเช่น แอปรูปภาพที่ รูปภาพสามารถค้นหาข้อมูลชุดย่อยที่จะแสดงในหน้าเว็บได้ แต่ละหน้า ของผลลัพธ์ที่แสดงโดยผู้ให้บริการเนื้อหาจะแสดงด้วยเคอร์เซอร์ตัวเดียว ออบเจ็กต์ ทั้งลูกค้าและผู้ให้บริการต้องใช้การแบ่งหน้าเพื่อใช้ประโยชน์จาก ฟีเจอร์นี้

สำหรับข้อมูลโดยละเอียดเกี่ยวกับการเปลี่ยนแปลงผู้ให้บริการเนื้อหา โปรดดู ContentProvider และ ContentProviderClient

คำขอรีเฟรชเนื้อหา

ContentProvider และ ขณะนี้ ContentResolver ชั้นเรียนแต่ละชั้นมี refresh() เพื่อให้ลูกค้าทราบข้อมูลได้ง่ายขึ้นว่า ข้อมูลที่ลูกค้าขอนั้นเป็นปัจจุบัน

คุณสามารถเพิ่มตรรกะการรีเฟรชเนื้อหาที่กำหนดเองได้โดยการขยาย ContentProvider โปรดตรวจสอบว่าคุณได้ลบล้าง refresh() วิธีในการส่งคืน true หมายถึงลูกค้าของผู้ให้บริการว่าคุณได้พยายามแล้ว เพื่อรีเฟรชข้อมูลด้วยตัวเอง

แอปไคลเอ็นต์ขอเนื้อหาที่รีเฟรชได้อย่างชัดแจ้งโดยเรียกใช้ วิธีอื่นที่เรียกอีกอย่างว่า refresh() เมื่อโทรหารายการนี้ ส่งใน URI ของข้อมูลที่จะรีเฟรช

หมายเหตุ: เนื่องจากคุณอาจขอข้อมูลผ่านเครือข่าย คุณควรเรียกใช้ refresh() จาก ฝั่งไคลเอ็นต์เฉพาะเมื่อมีข้อความที่ชัดเจนว่าเนื้อหาเก่า สาเหตุที่พบบ่อยที่สุดในการรีเฟรชเนื้อหาประเภทนี้คือ ปัดเพื่อรีเฟรช เพื่อแสดง UI ล่าสุดอย่างชัดเจน เพื่อให้แสดงเนื้อหาที่อัปเดต

การปรับปรุง JobScheduler

Android 8.0 (API ระดับ 26) มีการปรับปรุงหลายอย่างให้กับ JobScheduler การปรับปรุงเหล่านี้จะทำให้แอปของคุณ เพื่อให้สอดคล้องกับพื้นหลังใหม่ ขีดจำกัดการดำเนินการ เนื่องจากโดยทั่วไปคุณสามารถใช้งานที่กำหนดเวลาไว้เพื่อแทนที่ บริการที่ทำงานอยู่เบื้องหลังที่ถูกจำกัดหรือตัวรับการออกอากาศโดยปริยาย

การอัปเดต JobScheduler มีดังนี้

  • ขณะนี้คุณเชื่อมโยงคิวงานกับงานที่กำหนดเวลาไว้ได้แล้ว วิธีเพิ่มรายการงานลงใน คิวงาน, การโทร JobScheduler.enqueue() เมื่องานอยู่ระหว่างดำเนินการ สามารถนำงานที่รอดำเนินการออกจากคิวและประมวลผลได้ ฟังก์ชันนี้รองรับ Use Case หลายอย่างที่ก่อนหน้านี้ต้องเจอ เรียกร้องให้เริ่มบริการในเบื้องหลัง โดยเฉพาะบริการที่ใช้ IntentService
  • Android Support Library 26.0.0 แนะนำคลาส JobIntentService ใหม่ ซึ่งมี เป็น IntentService แต่ใช้งานแทน บริการเมื่อทำงานใน Android 8.0 (API ระดับ 26) ขึ้นไป
  • ตอนนี้คุณสามารถโทร JobInfo.Builder.setClipData() เพื่อเชื่อมโยง ClipData เข้ากับงาน ตัวเลือกนี้จะทำให้ คุณต้องเชื่อมโยงการให้สิทธิ์ URI กับงาน ซึ่งคล้ายกับวิธี สามารถเผยแพร่สิทธิ์ไปยัง Context.startService() คุณยังใช้การให้สิทธิ์ URI กับ Intent ได้ด้วย เกี่ยวกับคิวงาน
  • ตอนนี้งานที่กำหนดเวลาไว้รองรับข้อจำกัดใหม่หลายประการ ดังนี้
    JobInfo.isRequireStorageNotLow()
    งานจะไม่ทำงานหากพื้นที่เก็บข้อมูลที่พร้อมใช้งานของอุปกรณ์เหลือน้อย
    JobInfo.isRequireBatteryNotLow()
    งานจะไม่ทำงานหากระดับแบตเตอรี่อยู่ที่หรือต่ำกว่าระดับวิกฤต เกณฑ์ นี่คือระดับที่อุปกรณ์แสดงแบตเตอรี่ต่ำ คำเตือน กล่องโต้ตอบของระบบ
    NETWORK_TYPE_METERED
    งานต้องใช้การเชื่อมต่อเครือข่ายแบบจำกัดปริมาณ เช่น ข้อมูลเครือข่ายมือถือส่วนใหญ่ แพ็กเกจ

พื้นที่เก็บข้อมูลที่กำหนดเอง

Android 8.0 (API ระดับ 26) ให้คุณมอบพื้นที่เก็บข้อมูลที่กำหนดเองให้กับค่ากำหนด ซึ่งสามารถ มีประโยชน์หากแอปจัดเก็บค่ากำหนดในระบบคลาวด์หรือฐานข้อมูลในเครื่อง หรือ หากค่ากำหนดนั้นเจาะจงอุปกรณ์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ การใช้พื้นที่เก็บข้อมูล โปรดดู พื้นที่เก็บข้อมูลที่กำหนดเอง

การเพิ่มประสิทธิภาพสื่อ

VolumeShaper

มีชั้นเรียน VolumeShaper ใหม่ ใช้ เพื่อดําเนินการเปลี่ยนระดับเสียงอัตโนมัติสั้นๆ เช่น เฟดอิน เฟดเอาต์ และการเฟด ดูการควบคุม Amplitude ด้วย VolumeShaper เพื่อดูข้อมูลเพิ่มเติม

การเพิ่มประสิทธิภาพโฟกัสเสียง

แอปเสียงจะแชร์เอาต์พุตเสียงในอุปกรณ์โดยการขอและยกเลิกการโฟกัสเสียง แอปจะจัดการการเปลี่ยนแปลงโฟกัสโดยการเริ่มหรือหยุดการเล่น หรือการลดระดับเสียง มีชั้นเรียน AudioFocusRequest ใหม่ การใช้คลาสนี้เป็นพารามิเตอร์ของ requestAudioFocus(), แอปมีความสามารถในการทำงานแบบใหม่เมื่อต้องรับมือกับการเปลี่ยนแปลงในโฟกัสของเสียง ดังนี้ การลดโดยอัตโนมัติและ การเพิ่มขึ้นของโฟกัสแบบหน่วงเวลา

เมตริกสื่อ

เมธอด getMetrics() ใหม่แสดงผล PersistableBundle ออบเจ็กต์ที่มีการกำหนดค่า และข้อมูลประสิทธิภาพ ซึ่งแสดงเป็นการแมปแอตทริบิวต์และค่า มีการกำหนดเมธอด getMetrics() สำหรับคลาสสื่อเหล่านี้

ระบบจะรวบรวมเมตริกสำหรับแต่ละอินสแตนซ์แยกกันและจะยังคงอยู่สำหรับ ตลอดอายุของอินสแตนซ์ หากไม่มีเมตริกที่พร้อมใช้งาน ระบบจะแสดงผลเมธอด ค่าว่าง โดยเมตริกจริงที่แสดงผลจะขึ้นอยู่กับคลาส

MediaPlayer

เริ่มตั้งแต่ Android 8.0 (API ระดับ 26) สามารถเล่น MediaPlayer ได้ ได้รับการป้องกันด้วย DRM วัสดุและสื่อที่เข้ารหัสระดับตัวอย่าง HLS

Android 8.0 เปิดตัวฟีเจอร์ใหม่ "โอเวอร์โหลด" คำสั่ง seekTo() ที่แสดงแบบละเอียด เมื่อกรอวิดีโอไปยังเฟรม โดยมีพารามิเตอร์ที่ 2 ที่ระบุโหมดค้นหา ดังนี้

  • SEEK_PREVIOUS_SYNC ย้ายตำแหน่งสื่อไปยังเฟรมการซิงค์ (หรือแป้น) ที่เกี่ยวข้องกับแหล่งข้อมูลที่แสดงอยู่ก่อนหน้าหรือในช่วงเวลาที่ระบุ
  • SEEK_NEXT_SYNC ย้ายตำแหน่งสื่อไปยังเฟรมการซิงค์ (หรือแป้น) ที่เกี่ยวข้อง กับแหล่งข้อมูลซึ่งอยู่หลังหรือเวลาที่ระบุทันที
  • SEEK_CLOSEST_SYNC ย้ายตำแหน่งสื่อไปยังเฟรมการซิงค์ (หรือแป้น) เชื่อมโยงกับแหล่งข้อมูลที่อยู่ใกล้ที่สุด หรือในเวลาที่ระบุ
  • SEEK_CLOSEST ย้ายตำแหน่งสื่อไปยังเฟรม (ไม่จำเป็นต้องซิงค์ หรือคีย์เฟรม) ที่เชื่อมโยงกับแหล่งข้อมูลที่อยู่ใกล้หรือ ในช่วงเวลาที่กำหนด

เมื่อกรอวิดีโออย่างต่อเนื่อง แอปควรใช้โหมด SEEK_ แทน SEEK_CLOSEST ซึ่งจะทํางานได้ค่อนข้างช้าลงแต่ทํางานได้แม่นยํากว่า

โปรแกรมบันทึกสื่อ

  • ขณะนี้ MediaRecorder สนับสนุนรูปแบบ MPEG2_TS ที่มีประโยชน์สำหรับ สตรีมมิง:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    ดู MediaRecorder.OutputFormat

  • MediaMuxer รองรับสตรีมเสียงและวิดีโอกี่รายการก็ได้ ยกเลิกการจำกัดแล้ว ไปยังแทร็กเสียง 1 แทร็กและ/หรือแทร็กวิดีโอ 1 แทร็ก ใช้ addTrack() เพื่อมิกซ์แทร็กได้มากเท่าที่ต้องการ
  • นอกจากนี้ MediaMuxer ยังเพิ่มแทร็กข้อมูลเมตาอย่างน้อย 1 แทร็กที่มีแทร็กที่ผู้ใช้กำหนดต่อเฟรมได้ด้วย แอปพลิเคชันของคุณเป็นผู้กำหนดรูปแบบของข้อมูลเมตา แทร็กข้อมูลเมตารองรับเฉพาะคอนเทนเนอร์ MP4

ข้อมูลเมตาอาจเป็นประโยชน์ต่อการประมวลผลแบบออฟไลน์ เช่น สัญญาณไจโรจาก สามารถใช้เซ็นเซอร์เพื่อทำการป้องกันภาพวิดีโอสั่นไหว

เมื่อเพิ่มแทร็กข้อมูลเมตา รูปแบบ MIME ของแทร็กต้องขึ้นต้นด้วยคำนำหน้า "application/" การเขียนข้อมูลเมตาเหมือนกับการเขียนข้อมูลวิดีโอ/เสียง ยกเว้น ว่าข้อมูลไม่ได้มาจาก MediaCodec แต่แอปจะส่ง ByteBuffer ที่มีการประทับเวลาที่เชื่อมโยงกับ writeSampleData() วิธี การประทับเวลาต้องอยู่ในฐานเวลาเดียวกันกับแทร็กวิดีโอและแทร็กเสียง

ไฟล์ MP4 ที่สร้างขึ้นใช้ TextMetaDataSampleEntry ที่กำหนดไว้ในส่วน 12.3.3.2 ของ ISOBMFF เพื่อส่งสัญญาณรูปแบบ MIME ของข้อมูลเมตา เมื่อใช้ MediaExtractor เพื่อแยกไฟล์ด้วยแทร็กข้อมูลเมตา MIME รูปแบบของข้อมูลเมตาจะแยกเป็น MediaFormat

ปรับปรุงการเข้าถึงไฟล์สื่อ

เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล (SAF) ทำให้แอปแสดง DocumentsProvider ซึ่งให้สิทธิ์เข้าถึงไฟล์ได้ ในแหล่งข้อมูลไปยังแอปอื่นๆ ที่จริงแล้ว ผู้ให้บริการเอกสารยังสามารถให้สิทธิ์เข้าถึงไฟล์ ที่อยู่ในพื้นที่เก็บข้อมูลเครือข่ายหรือที่ใช้โปรโตคอล เช่น โปรโตคอลการถ่ายโอนสื่อ (MTP)

อย่างไรก็ตาม การเข้าถึงไฟล์สื่อขนาดใหญ่จากแหล่งข้อมูลระยะไกลอาจทำให้ ชาเลนจ์:

  • มีเดียเพลเยอร์ต้องใช้การเข้าถึงไฟล์ได้จากผู้ให้บริการเอกสาร ในกรณีที่มีไฟล์สื่อขนาดใหญ่อยู่ในแหล่งข้อมูลระยะไกล ผู้ให้บริการเอกสารต้องดึงข้อมูลทั้งหมดล่วงหน้าและสร้างสแนปชอต ข้อบ่งชี้ไฟล์ มีเดียเพลเยอร์ไม่สามารถเล่นไฟล์โดยไม่มีไฟล์ ข้อบ่งชี้ การเล่นจึงไม่สามารถเริ่มเล่นได้จนกว่าผู้ให้บริการเอกสารจะเสร็จสิ้น กำลังดาวน์โหลดไฟล์
  • เครื่องมือจัดการคอลเล็กชันสื่อ เช่น แอปรูปภาพ จะต้องข้ามผ่านชุด เข้าถึง URI เพื่อเข้าถึงสื่อที่จัดเก็บไว้ในการ์ด SD ภายนอกผ่านขอบเขต โฟลเดอร์ รูปแบบการเข้าถึงนี้ทำให้มีการดำเนินการจำนวนมากในสื่อ เช่น การย้าย คัดลอก และลบ ค่อนข้างช้า
  • ผู้จัดการคอลเล็กชันสื่อไม่สามารถระบุตำแหน่งของเอกสารได้ URI ซึ่งทำให้ผู้ใช้เลือกแอปประเภทนี้ได้ยาก ตำแหน่งที่จะบันทึกไฟล์สื่อ

Android 8.0 แก้ปัญหาเหล่านี้โดยปรับปรุงการเข้าถึงพื้นที่เก็บข้อมูล กรอบการทำงาน

ผู้ให้บริการเอกสารที่กำหนดเอง

ตั้งแต่ Android 8.0 เป็นต้นไป เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูลจะช่วยให้ เอกสารที่กำหนดเอง ของผู้ให้บริการเพื่อสร้างข้อบ่งชี้ไฟล์ที่ค้นหาได้สำหรับไฟล์ที่อยู่ใน แหล่งข้อมูลระยะไกล SAF สามารถเปิดไฟล์เพื่อรับไฟล์แบบเนทีฟที่ค้นหาได้ ข้อบ่งชี้ จากนั้น SAF จะส่งคำขอไบต์ข้อมูลแบบไม่ต่อเนื่องไปยังเอกสาร ฟีเจอร์นี้ช่วยให้ผู้ให้บริการเอกสารแสดงช่วงที่แน่นอนได้ ที่แอปมีเดียเพลเยอร์ได้ร้องขอแทนที่จะแคชทั้งหมด ล่วงหน้า

หากต้องการใช้ฟีเจอร์นี้ คุณต้องเรียกฟิลด์ StorageManager.openProxyFileDescriptor() วิธี เมธอด openProxyFileDescriptor() ยอมรับออบเจ็กต์ ProxyFileDescriptorCallback เป็น Callback SAF เรียกร้อง Callback ทุกครั้งที่แอปพลิเคชันไคลเอ็นต์ดำเนินการกับไฟล์บน ข้อบ่งชี้ไฟล์ที่ส่งคืนจากผู้ให้บริการเอกสาร

การเข้าถึงเอกสารโดยตรง

สำหรับ Android 8.0 (API ระดับ 26) คุณสามารถใช้ getDocumentUri() วิธีในการ รับ URI ที่อ้างอิงเอกสารเดียวกันกับ mediaUri ที่ระบุ แต่เนื่องจาก URI ที่แสดงผลได้รับการสนับสนุนโดย DocumentsProvider ผู้จัดการคอลเล็กชันสื่อสามารถเข้าถึงได้ เอกสารได้โดยตรง โดยไม่ต้องข้ามผ่านต้นไม้ในไดเรกทอรีที่มีขอบเขต ด้วยเหตุนี้ ผู้จัดการสื่อจึงดำเนินการเกี่ยวกับไฟล์ในเอกสารได้ ได้รวดเร็วยิ่งขึ้น

ข้อควรระวัง: เมธอด getDocumentUri() จะค้นหาเฉพาะไฟล์สื่อเท่านั้น ไม่ได้ให้สิทธิ์แอป สิทธิ์การเข้าถึงไฟล์เหล่านั้น ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีรับสิทธิ์เข้าถึง สิทธิ์ในไฟล์สื่อ โปรดดูเอกสารอ้างอิง

เส้นทางไปยังเอกสาร

เมื่อใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูลใน Android 8.0 (API ระดับ 26) คุณสามารถใช้ เมธอด findDocumentPath() ใช้ได้ในทั้ง 2 เมธอด DocumentsContract และ DocumentsProvider เพื่อระบุเส้นทางจากรากของระบบไฟล์ที่ระบุ ID เมธอดจะแสดงเส้นทางนี้ใน ออบเจ็กต์ DocumentsContract.Path รายการ ในกรณีที่ไฟล์ ระบบมีเส้นทางที่กำหนดไว้หลายเส้นทางไปยังเอกสารเดียวกัน เมธอดจะแสดง เส้นทางที่ใช้บ่อยที่สุดในการเข้าถึงเอกสารที่มีรหัสที่กำหนด

ฟังก์ชันนี้จะเป็นประโยชน์อย่างยิ่งในสถานการณ์ต่อไปนี้

  • แอปของคุณใช้การ "บันทึกเป็น" กล่องโต้ตอบที่แสดงตำแหน่งของ เอกสารที่ต้องการ
  • แอปของคุณแสดงโฟลเดอร์ในมุมมองผลการค้นหาและต้องโหลดรายการย่อย ที่อยู่ในโฟลเดอร์เฉพาะ หากผู้ใช้เลือก โฟลเดอร์

หมายเหตุ: หากแอปมีสิทธิ์เข้าถึงเอกสารบางอย่างเท่านั้น ในเส้นทาง ค่าที่ส่งกลับ findDocumentPath() จะรวมเฉพาะ โฟลเดอร์และเอกสารที่แอปของคุณเข้าถึงได้

การตรวจสอบการเล่นเสียง

บริการของระบบ AudioManager เก็บรักษารายการ ออบเจ็กต์ AudioPlaybackConfiguration ที่ใช้งานอยู่ แต่ละรายการ มีข้อมูลเกี่ยวกับเซสชันการเล่นเสียงที่เฉพาะเจาะจง แอปของคุณสามารถ ดึงชุดการกำหนดค่าที่ใช้งานอยู่ในปัจจุบันโดยการเรียกใช้ getActivePlaybackConfigurations()

สำหรับ Android 8.0 (API ระดับ 26) คุณสามารถลงทะเบียน Callback ที่แจ้งเตือน แอปของคุณเมื่อ มีการเปลี่ยนแปลง AudioPlaybackConfiguration ออบเจ็กต์ โดยดำเนินการดังนี้ เรียก registerAudioPlaybackCallback() ซึ่งผ่านในกรณี AudioManager.AudioPlaybackCallback AudioManager.AudioPlaybackCallback คลาสมีฟังก์ชัน onPlaybackConfigChanged() ซึ่งระบบเรียกใช้เมื่อเสียง การเปลี่ยนแปลงการกำหนดค่าการเล่น

การเชื่อมต่อ

การรับรู้ Wi-Fi

Android 8.0 (API ระดับ 26) เพิ่มการรองรับ Wi-Fi Aware ซึ่งอิงตาม Neighbor ข้อกำหนดเฉพาะสำหรับเครือข่ายการรับรู้ (NAN) ในอุปกรณ์ที่มี ฮาร์ดแวร์ Wi-Fi Aware, แอป และอุปกรณ์ที่อยู่ใกล้เคียงสามารถค้นพบและสื่อสารได้ ผ่าน Wi-Fi โดยไม่ต้องใช้จุดเชื่อมต่ออินเทอร์เน็ต เรากำลังพัฒนาฮาร์ดแวร์ เพื่อนำเทคโนโลยี Wi-Fi Aware มาใช้กับอุปกรณ์ได้โดยเร็วที่สุด สำหรับ เกี่ยวกับวิธีผสานรวม Wi-Fi Aware ในแอปของคุณ โปรดดูที่ Wi-Fi Aware

บลูทูธ

Android 8.0 (API ระดับ 26) เพิ่มการรองรับบลูทูธของแพลตฟอร์มด้วยการเพิ่มสิ่งต่อไปนี้ ได้แก่

  • รองรับมาตรฐาน AVRCP 1.4 ซึ่งช่วยให้เรียกดูคลังเพลงได้
  • รองรับมาตรฐานบลูทูธพลังงานต่ำ (BLE) 5.0
  • การผสานรวมตัวแปลงรหัส Sony LDAC เข้ากับสแต็กบลูทูธ

การจับคู่อุปกรณ์ที่ใช้ร่วมกัน

Android 8.0 (API ระดับ 26) มี API ที่ช่วยให้คุณปรับแต่ง กล่องโต้ตอบคำขอจับคู่เมื่อพยายามจับคู่กับอุปกรณ์ที่ใช้ร่วมกันผ่าน บลูทูธ, BLE และ Wi-Fi สำหรับข้อมูลเพิ่มเติม โปรดดู อุปกรณ์ที่ใช้ร่วมกัน กำลังจับคู่อุปกรณ์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้บลูทูธใน Android โปรดดู คำแนะนำบลูทูธ สำหรับ การเปลี่ยนแปลงในบลูทูธที่มีเฉพาะใน Android 8.0 (API ระดับ 26) โปรดดู ส่วนบลูทูธของ หน้าการเปลี่ยนแปลงลักษณะการทำงานของ Android 8.0

การแชร์

การแชร์อัจฉริยะ

Android 8.0 (API ระดับ 26) เรียนรู้เกี่ยวกับผู้ใช้ การแชร์ที่ปรับเปลี่ยนในแบบของคุณ ที่เหมาะสม และเข้าใจได้ดีขึ้นสำหรับเนื้อหาแต่ละประเภท ที่จะแชร์ด้วย เช่น หากผู้ใช้ถ่ายภาพใบเสร็จ Android 8.0 สามารถแนะนำแอปติดตามค่าใช้จ่ายได้ หากผู้ใช้ถ่ายเซลฟี โซเชียลมีเดีย จัดการกับรูปภาพได้ดีขึ้น Android 8.0 จะเรียนรู้ทั้งหมดนี้โดยอัตโนมัติ รูปแบบตามผู้ใช้ ค่ากำหนดที่ปรับเปลี่ยนในแบบของคุณ

การแชร์อัจฉริยะใช้ได้กับเนื้อหาประเภทอื่นๆ นอกเหนือจาก image เช่น audio, video, text, URL อื่นๆ

หากต้องการเปิดใช้การแชร์อัจฉริยะ ให้เพิ่มArrayListได้สูงสุด 3 บัญชี สตริงคำอธิบายประกอบที่สื่อถึง Intent ที่แชร์เนื้อหานั้น คำอธิบายประกอบควร อธิบายส่วนประกอบหรือหัวข้อหลักๆ ในเนื้อหา ตัวอย่างโค้ดต่อไปนี้ แสดงวิธีการเพิ่มคำอธิบายประกอบให้กับ Intent ดังนี้

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

โปรดดูข้อมูลโดยละเอียดเกี่ยวกับคำอธิบายประกอบของการแชร์อัจฉริยะที่หัวข้อ EXTRA_CONTENT_ANNOTATIONS

ตัวแยกประเภทข้อความ

ในอุปกรณ์ที่ใช้งานร่วมกันได้ แอปสามารถใช้ตัวแยกประเภทข้อความใหม่เพื่อตรวจสอบว่า สตริงตรงกับประเภทเอนทิตีตัวแยกประเภทที่รู้จักและรับการเลือกที่แนะนำ ทางเลือก เอนทิตีที่ระบบรู้จัก ได้แก่ ที่อยู่, URL, หมายเลขโทรศัพท์ และที่อยู่อีเมล สำหรับข้อมูลเพิ่มเติม โปรดดู TextClassifier

การช่วยเหลือพิเศษ

Android 8.0 (API ระดับ 26) รองรับฟีเจอร์การช่วยเหลือพิเศษใหม่ๆ มากมายสำหรับ นักพัฒนาซอฟต์แวร์ที่สร้างบริการการช่วยเหลือพิเศษของตนเอง

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทําให้แอปเข้าถึงได้ง่ายขึ้น ดูการช่วยเหลือพิเศษ

ความปลอดภัยและความเป็นส่วนตัว

สิทธิ์

Android 8.0 (API ระดับ 26) มาพร้อมกับสิทธิ์ใหม่ๆ มากมายที่เกี่ยวข้องกับโทรศัพท์ ดังนี้

  • สิทธิ์ ANSWER_PHONE_CALLS อนุญาตให้แอปรับสายได้ รับสายเรียกเข้าแบบเป็นโปรแกรม วิธีจัดการกับสายเรียกเข้าใน คุณสามารถใช้ acceptRingingCall()
  • สิทธิ์ READ_PHONE_NUMBERS ให้สิทธิ์อ่านแอปแก่ หมายเลขโทรศัพท์ที่จัดเก็บไว้ในอุปกรณ์

ทั้งสิทธิ์เหล่านี้จัดประเภทเป็น อันตราย และเป็นส่วนหนึ่งของ PHONE กลุ่มสิทธิ์

API สำหรับการเข้าถึงและการค้นพบบัญชีใหม่

Android 8.0 (API ระดับ 26) มีการปรับปรุงหลายอย่างที่ช่วยให้ แอปจะเข้าถึงบัญชีผู้ใช้ได้ สำหรับบัญชีที่พวกเขาจัดการ เครื่องมือตรวจสอบสิทธิ์สามารถใช้นโยบายของตนเองเพื่อตัดสินใจว่าจะซ่อนบัญชีหรือไม่ หรือเปิดเผยบัญชีแก่แอป ระบบ Android ติดตามแอปพลิเคชันที่สามารถ เข้าถึงบัญชีใดบัญชีหนึ่งได้

ใน Android เวอร์ชันก่อนหน้า แอปที่ต้องการติดตามรายการ บัญชีผู้ใช้จะได้รับการอัปเดตเกี่ยวกับทุกบัญชี รวมถึงบัญชีที่มี ประเภทที่ไม่เกี่ยวข้อง Android 8.0 เพิ่ม addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) ซึ่งช่วยให้แอปสามารถระบุรายการประเภทบัญชี ที่ควรรับการเปลี่ยนแปลงในบัญชี

การเปลี่ยนแปลง API

AccountManager เสนอวิธีการใหม่ 6 วิธีเพื่อช่วย Authenticator จัดการ แอปสามารถดูบัญชีได้ดังนี้

Android 8.0 (API ระดับ 26) ใช้ค่าชื่อแพ็กเกจพิเศษ 2 ค่าเพื่อระบุระดับการเข้าถึง ระดับสำหรับแอปพลิเคชันที่ไม่ได้ตั้งค่าโดยใช้ setAccountVisibility(android.accounts.Account, java.lang.String, int) PACKAGE_NAME_KEY_LEGACY_VISIBLE ค่าระดับการเข้าถึงจะมีผลกับแอปที่มี วันที่ GET_ACCOUNTS และเวอร์ชันเป้าหมายของ Android ต่ำกว่า Android 8.0 หรือเจ้าของ ลายเซ็นจะตรงกับ Authenticator ที่กําหนดเป้าหมายเป็น Android เวอร์ชันใดก็ตาม PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE กำหนดค่าระดับการเข้าถึงเริ่มต้นสำหรับ แอปที่ก่อนหน้านี้ไม่ได้ตั้งค่าไว้ และแอปใด PACKAGE_NAME_KEY_LEGACY_VISIBLEไม่ใช่ ที่เกี่ยวข้อง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึงบัญชีใหม่และการค้นพบ API โปรดดูที่ ข้อมูลอ้างอิงสำหรับ AccountManager และ OnAccountsUpdateListener

การทดสอบ

การทดสอบการวัดคุม

Android 8.0 (API ระดับ 26) ให้การสนับสนุนเพิ่มเติมต่อไปนี้สำหรับแอปของคุณ ของ Google Analytics

ทำงานโดยใช้กระบวนการของแอปที่ไม่ใช่ค่าเริ่มต้น

ตอนนี้คุณสามารถระบุได้ว่าควรใช้การทดสอบการใช้เครื่องมือหนึ่งๆ กับ กระบวนการที่อยู่นอกกระบวนการเริ่มต้นของแอป การกำหนดค่านี้มีประโยชน์ในกรณีต่อไปนี้ แอปมีกิจกรรมหลายอย่างที่ทำงานในกระบวนการที่ต่างกัน

หากต้องการกำหนดการใช้เครื่องมือสำหรับกระบวนการที่ไม่ใช่ค่าเริ่มต้น ให้ไปที่ไฟล์ Manifest แล้วไปยังไฟล์ <instrumentation> เพิ่ม android:targetProcess และตั้งค่าเป็น 1 ใน ดังต่อไปนี้

  • ชื่อของกระบวนการหนึ่งๆ
  • รายการชื่อกระบวนการที่คั่นด้วยคอมมา
  • ไวลด์การ์ด ("*") ซึ่งช่วยให้เครื่องมือทํางานได้ เทียบกับกระบวนการที่เปิดอยู่ซึ่งเรียกใช้โค้ดในแพ็กเกจที่ระบุใน android:targetPackage

ขณะที่ทดสอบการใช้เครื่องมืออยู่ คุณตรวจสอบได้ว่ากระบวนการใด กำลังทดสอบโดยโทรหา getProcessName()

รายงานผลลัพธ์ระหว่างการทดสอบ

ตอนนี้คุณรายงานผลลัพธ์ขณะที่การทดสอบการใช้เครื่องมือทำงานอยู่ได้แล้ว โดยโทรหา addResults() แทนหลังจากนั้น

จำลองความตั้งใจสำหรับการทดสอบ

ช่วยให้สร้างการทดสอบ UI แยกอิสระสำหรับแอป กิจกรรม Android 8.0 (API ระดับ 26) เปิดตัว onStartActivity() วิธี คุณลบล้างเมธอดนี้ในคลาสย่อยที่กำหนดเองของ Instrumentation.ActivityMonitor ชั้นเรียนเพื่อจัดการเฉพาะ ที่คลาสทดสอบเรียกใช้

เมื่อคลาสการทดสอบเรียกใช้ Intent เมธอดจะแสดงต้นขั้ว Instrumentation.ActivityResult แทนการดำเนินการ ที่ตัวความตั้งใจเอง เมื่อใช้ตรรกะความตั้งใจจำลองนี้ในการทดสอบ คุณจะสามารถโฟกัส เกี่ยวกับวิธีเตรียมกิจกรรมและจัดการความตั้งใจที่คุณส่งไปยัง กิจกรรมที่ต่างกันหรือใช้กับแอปอื่นโดยสิ้นเชิง

รันไทม์และ เครื่องมือ

การเพิ่มประสิทธิภาพแพลตฟอร์ม

Android 8.0 (API ระดับ 26) นำรันไทม์และการเพิ่มประสิทธิภาพอื่นๆ มาสู่แพลตฟอร์มที่ ทำให้ประสิทธิภาพดีขึ้นหลายประการ การเพิ่มประสิทธิภาพเหล่านี้รวมถึงการเก็บขยะแบบบีบอัดพร้อมกัน การใช้หน่วยความจำและตำแหน่งที่ตั้งของโค้ดอย่างมีประสิทธิภาพยิ่งขึ้น

การเพิ่มประสิทธิภาพเหล่านี้ช่วยให้เปิดเครื่องได้เร็วขึ้น และช่วยให้การทำงานทั้ง ระบบปฏิบัติการและแอป

การสนับสนุนภาษา Java ที่ได้รับการอัปเดต

Android 8.0 (API ระดับ 26) เพิ่มการรองรับ OpenJDK Java API เพิ่มเติมหลายรายการ ดังนี้

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับคลาสและวิธีการภายในที่เพิ่มเข้ามาใหม่เหล่านี้ โปรดดูเอกสารอ้างอิง API

หากต้องการ ที่ใช้ฟีเจอร์ภาษาของ Java 8 ใน Android Studio คุณควร ดาวน์โหลดเวอร์ชันตัวอย่างล่าสุด

อัปเดต API เฟรมเวิร์ก Android ของ ICU4J

Android 8.0 (API ระดับ 26) ขยาย เฟรมเวิร์ก Android ICU4J API ซึ่งเป็นชุดย่อยของ ICU4J API สำหรับนักพัฒนาแอปเพื่อ ใช้ในแพ็กเกจ android.icu API เหล่านี้ใช้ข้อมูลการแปล บนอุปกรณ์ ดังนั้นคุณจะสามารถลดรอยเท้า APK ด้วยการไม่คอมไพล์ ไลบรารี ICU4J ใน APK ของคุณ

ตาราง 1 เวอร์ชัน ICU, CLDR และ Unicode ที่ใช้ ใน Android

ระดับ API ของ Android เวอร์ชัน ICU เวอร์ชัน CLDR เวอร์ชัน Unicode
Android 7.0 (API ระดับ 24), Android 7.1 (API ระดับ 25) 56 28 8.0
Android 8.0 (API ระดับ 26) 58.2 30.0.3 9.0

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับให้เป็นสากลบน Android ซึ่งรวมถึง การสนับสนุน ICU4J โปรดดู การทำให้เป็นสากลบน Android

Android Enterprise

เปิดตัวฟีเจอร์สำหรับองค์กรและ API ใหม่สำหรับอุปกรณ์ที่ใช้ Android 8.0 (API ระดับ 26) ไฮไลต์มีดังนี้

  • โปรไฟล์งานในอุปกรณ์ที่มีการจัดการครบวงจรช่วยให้องค์กรแยกงานออกจาก ข้อมูลส่วนตัวในขณะที่จัดการทั้ง 2 อย่าง
  • การมอบสิทธิ์ API ช่วยให้เจ้าของอุปกรณ์และเจ้าของโปรไฟล์กำหนดแอปได้ ไปยังแอปพลิเคชันอื่นได้ด้วย
  • การปรับปรุงประสบการณ์ของผู้ใช้ในขั้นตอนการจัดสรร (รวมถึง ตัวเลือกการกำหนดค่าเอง) ซึ่งช่วยลดเวลาในการตั้งค่าได้
  • การควบคุมแบบใหม่ผ่านบลูทูธ, Wi-Fi, การสำรองข้อมูล และการรักษาความปลอดภัยช่วยให้องค์กรต่างๆ ได้ จัดการอุปกรณ์ได้มากขึ้น การบันทึกกิจกรรมในเครือข่ายช่วยให้องค์กรติดตามได้ ปัญหาลง

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ API และฟีเจอร์ใหม่อื่นๆ ของ Android Enterprise ดู Android ใน Enterprise