ฟีเจอร์และ 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() เพื่อตั้งค่าข้อความที่จะปรากฏเมื่อคุณสร้างลิงก์ไปยังการตั้งค่าการแจ้งเตือนของแอปจากการแจ้งเตือนโดยใช้ Intent Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES ระบบอาจระบุข้อมูลเพิ่มเติมต่อไปนี้โดยมีจุดประสงค์เพื่อกรองการตั้งค่าที่แอปต้องแสดงต่อผู้ใช้ ได้แก่ 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 ที่แสดงเนื้อหาเว็บในแอป ซึ่งได้แก่

  • Version API
  • Google SafeBrowsing API
  • 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 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 Support Library มาพร้อมกับ Android 8.0

AnimatorSet

ตั้งแต่ 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() เนื่องจาก getAllocatableBytes(UUID) จะพิจารณาข้อมูลที่แคชไว้ซึ่งระบบยินดีล้างข้อมูลในนามของคุณ

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

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

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

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

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

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

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

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

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

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

การอัปเดต 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) ให้การรองรับเพิ่มเติมต่อไปนี้สําหรับการทดสอบเครื่องมือวัดผลของแอป

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

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

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

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

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

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

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

จำลอง Intent สำหรับการทดสอบ

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

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

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

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

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) ขยายAPI ของเฟรมเวิร์ก ICU4J สำหรับ Android ซึ่งเป็นชุดย่อยของ 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