API ของ Android 3.1

ระดับ API: 12

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

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

ภาพรวมของ API

ส่วนต่างๆ ด้านล่างจะแสดงภาพรวมทางเทคนิคเกี่ยวกับสิ่งใหม่ๆ สำหรับนักพัฒนาซอฟต์แวร์ ใน Android 3.1 รวมถึงฟีเจอร์ใหม่ๆ และการเปลี่ยนแปลงในเฟรมเวิร์ก API นับตั้งแต่ เวอร์ชันก่อนหน้า

API ของ USB

Android 3.1 เปิดตัว API ใหม่ที่มีประสิทธิภาพสำหรับการผสานรวมอุปกรณ์ต่อพ่วงที่เชื่อมต่อกับแอปพลิเคชันที่ทำงานบนแพลตฟอร์ม API นี้อิงตามสแต็ก USB (Universal Serial Bus) และบริการที่ ไว้ในแพลตฟอร์ม รวมถึงการสนับสนุนทั้งสำหรับโฮสต์และอุปกรณ์ USB การโต้ตอบ เมื่อใช้ API นักพัฒนาแอปสามารถสร้างแอปพลิเคชันที่ค้นพบ สื่อสาร และจัดการอุปกรณ์ประเภทต่างๆ ที่เชื่อมต่อผ่าน USB ได้

สแต็กและ API แยกความแตกต่างของฮาร์ดแวร์ USB พื้นฐาน 2 ประเภท อุปกรณ์ที่ใช้ Android ทำหน้าที่เป็นโฮสต์หรือฮาร์ดแวร์ภายนอก ทำหน้าที่เป็นโฮสต์:

  • อุปกรณ์ USB คือฮาร์ดแวร์แบบเชื่อมต่อที่อาศัยอุปกรณ์ Android เป็นโฮสต์ เช่น อุปกรณ์อินพุตส่วนใหญ่ เมาส์ และจอยสติ๊กคืออุปกรณ์ USB เช่นเดียวกับกล้อง ฮับ และอื่นๆ
  • อุปกรณ์เสริม USB คือฮาร์ดแวร์แบบเชื่อมต่อที่มีตัวควบคุมโฮสต์ USB จ่ายไฟ และออกแบบมาเพื่อสื่อสารกับอุปกรณ์ที่ใช้ระบบปฏิบัติการ Android ผ่าน USB อุปกรณ์ต่อพ่วงต่างๆ สามารถเชื่อมต่อเป็นอุปกรณ์เสริมได้ ตั้งแต่ตัวควบคุมหุ่นยนต์ไปจนถึงอุปกรณ์ดนตรี จักรยานออกกำลังกาย และอื่นๆ

สำหรับทั้ง 2 ประเภท — อุปกรณ์ USB และอุปกรณ์เสริม USB — USB API ของแพลตฟอร์มรองรับการค้นพบโดยการออกอากาศผ่าน Intent เมื่อแนบหรือ ถอดออก รวมถึงอินเทอร์เฟซมาตรฐาน ปลายทาง และโหมดการโอน (ควบคุม แบบกลุ่ม และรบกวน)

USB API มีอยู่ในแพ็กเกจ android.hardware.usb คลาสหลักคือ UsbManager ซึ่งให้เมธอดตัวช่วยในการระบุและสื่อสารกับทั้งอุปกรณ์ USB และอุปกรณ์เสริม USB แอปพลิเคชันสามารถรับอินสแตนซ์ของ UsbManager แล้วค้นหารายการไฟล์แนบ อุปกรณ์หรืออุปกรณ์เสริม แล้วสื่อสารหรือจัดการอุปกรณ์เหล่านั้น UsbManager ยังประกาศการดำเนินการผ่าน Intent ที่ ออกอากาศของระบบ เพื่อประกาศเมื่อมีอุปกรณ์หรืออุปกรณ์เสริม USB หรือ ถอดออกแล้ว

ชั้นเรียนอื่นๆ ได้แก่

  • UsbDevice เป็นชั้นเรียนที่แสดงถึงภายนอก ฮาร์ดแวร์ที่เชื่อมต่อเป็นอุปกรณ์ USB (โดยอุปกรณ์ที่ใช้ Android ทำหน้าที่เป็น ของคุณ)
  • UsbAccessory แสดงฮาร์ดแวร์ภายนอก เชื่อมต่อเป็นโฮสต์ USB (โดยอุปกรณ์ที่ใช้ Android ทำหน้าที่เป็น USB อุปกรณ์)
  • UsbInterface และ UsbEndpoint ซึ่งให้สิทธิ์เข้าถึง USB มาตรฐาน ของอินเทอร์เฟซและปลายทางสำหรับอุปกรณ์
  • UsbDeviceConnection และ UsbRequest สำหรับการส่งและรับข้อมูลและข้อความควบคุมไปยังหรือจากอุปกรณ์ USB แบบซิงค์และแบบไม่ซิงค์
  • UsbConstants ซึ่งมีค่าคงที่สำหรับ การประกาศประเภทปลายทาง คลาสของอุปกรณ์ และอื่นๆ

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

นอกจากนี้ นักพัฒนาซอฟต์แวร์ยังสามารถขอให้กรองใน Google Play แอปพลิเคชันของตนจะไม่พร้อมให้บริการสำหรับผู้ใช้ที่ไม่มีอุปกรณ์ให้ การสนับสนุน USB ที่เหมาะสม หากต้องการขอการกรอง ให้เพิ่มองค์ประกอบต่อไปนี้อย่างน้อย 1 รายการลงในไฟล์ Manifest ของแอปตามความเหมาะสม

  • ในกรณีที่ควรมองเห็นแอปพลิเคชันในอุปกรณ์ที่รองรับ USB เท่านั้น โหมดโฮสต์ (การเชื่อมต่ออุปกรณ์ USB) ให้ประกาศองค์ประกอบนี้

    <uses-feature android:name="android.hardware.usb.host" android:required="true">

  • ในกรณีที่ควรมองเห็นแอปพลิเคชันในอุปกรณ์ที่รองรับ USB เท่านั้น อุปกรณ์เสริม (การเชื่อมต่อโฮสต์ USB) ให้ประกาศองค์ประกอบนี้

    <uses-feature android:name="android.hardware.usb.accessory" android:required="true">

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

หากต้องการดูตัวอย่างแอปพลิเคชันที่ใช้ USB Host API โปรดดูการทดสอบ ADB และ Missile Launcher

API ของ MTP/PTP

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

MTP API มีอยู่ในแพ็กเกจ android.mtp และให้ ชั้นเรียนเหล่านี้

  • MtpDevice สรุปอุปกรณ์ MTP ที่ เชื่อมต่อผ่านบัสของโฮสต์ USB แอปพลิเคชันสามารถสร้างอินสแตนซ์ของออบเจ็กต์ ประเภทนี้ แล้วใช้วิธีการของโมเดลดังกล่าว เพื่อรับข้อมูลเกี่ยวกับอุปกรณ์และ เก็บไว้ รวมทั้งการเปิดการเชื่อมต่อและการถ่ายโอนข้อมูล ตัวอย่างวิธีดังกล่าวมีดังนี้
    • getObjectHandles() แสดงรายการแฮนเดิลสำหรับออบเจ็กต์ทั้งหมดในอุปกรณ์ที่ ตรงกับรูปแบบที่ระบุและระดับบนสุด หากต้องการหาข้อมูลเกี่ยวกับออบเจ็กต์ ให้ทำดังนี้ แอปพลิเคชันสามารถส่งแฮนเดิลไปยัง getObjectInfo()
    • importFile() อนุญาตให้แอปพลิเคชันคัดลอกข้อมูลของออบเจ็กต์ไปยังไฟล์ภายนอก พื้นที่เก็บข้อมูล การเรียกใช้นี้อาจบล็อกเป็นเวลาตามกำหนด ขึ้นอยู่กับ ขนาดของข้อมูลและความเร็วของอุปกรณ์ ดังนั้นควรสร้างจากอัตราการเชื่อมต่อ ชุดข้อความ
    • open() ช่วยให้แอปพลิเคชันเปิดอุปกรณ์ MTP/PTP ที่เชื่อมต่อได้
    • getThumbnail() ทำรีเทิร์น ภาพขนาดย่อของออบเจ็กต์เป็นอาร์เรย์ไบต์
  • MtpStorageInfo เก็บข้อมูลเกี่ยวกับพื้นที่เก็บข้อมูล บนอุปกรณ์ MTP ซึ่งตรงกับชุดข้อมูล StorageInfo ที่อธิบายไว้ใน ส่วนที่ 5.2.2 ของข้อกำหนด MTP เมธอดในชั้นเรียนอนุญาตให้แอปพลิเคชัน รับสตริงคำอธิบาย พื้นที่ว่าง ความจุพื้นที่เก็บข้อมูลสูงสุด รหัสพื้นที่เก็บข้อมูล และตัวระบุปริมาณ
  • MtpDeviceInfo เก็บข้อมูลเกี่ยวกับอุปกรณ์ MTP ที่สอดคล้องกับชุดข้อมูล DeviceInfo ที่อธิบายไว้ในส่วน 5.1.1 ของข้อกําหนด MTP เมธอดในชั้นเรียนจะให้แอปพลิเคชันรับ ผู้ผลิต รุ่น หมายเลขซีเรียล และเวอร์ชัน
  • MtpObjectInfo เก็บข้อมูลเกี่ยวกับออบเจ็กต์ที่จัดเก็บในอุปกรณ์ MTP ซึ่งสอดคล้องกับชุดข้อมูล ObjectInfo ที่อธิบายไว้ในส่วน 5.3.1 ของข้อกำหนด MTP เมธอดในคลาสทำให้แอปพลิเคชันสามารถรับ ขนาดของออบเจ็กต์ รูปแบบข้อมูล ประเภทการเชื่อมโยง วันที่สร้าง และภาพขนาดย่อ
  • MtpConstants มีค่าคงที่สำหรับการประกาศไฟล์ MTP รูปแบบรหัส ประเภทการเชื่อมโยง และสถานะการป้องกัน

การสนับสนุนอุปกรณ์อินพุตใหม่และเหตุการณ์การเคลื่อนไหว

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

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

  • ACTION_SCROLL ซึ่งอธิบายเคอร์เซอร์ ตำแหน่งที่มีการเคลื่อนไหวการเลื่อนแบบไม่สัมผัส เช่น จากล้อเลื่อนของเมาส์ ก็เกิดขึ้น ใน MotionEvent ค่าของแกน AXIS_HSCROLL และ AXIS_VSCROLL จะระบุการเคลื่อนไหวของการเลื่อนแบบสัมพัทธ์
  • ACTION_HOVER_MOVE รายงานสถานการณ์ปัจจุบัน ของเมาส์เมื่อไม่ได้กดปุ่ม เช่นเดียวกับปุ่มระหว่างกลาง คะแนนนับตั้งแต่ HOVER_MOVE ครั้งล่าสุด วางเมาส์เหนือปุ่มเข้าและออก ยังไม่รองรับการแจ้งเตือน

เพื่อรองรับจอยสติ๊กและเกมแพด คลาส InputDevice มีแหล่งที่มาของอุปกรณ์อินพุตใหม่ต่อไปนี้

เพื่ออธิบายเหตุการณ์การเคลื่อนไหวจากแหล่งที่มาใหม่เหล่านี้ รวมถึงเหตุการณ์จากเมาส์ และแทร็กบอล ตอนนี้แพลตฟอร์มจะกำหนดรหัสแกนบน MotionEvent ซึ่งคล้ายกับการกำหนดรหัสหลักใน KeyEvent รหัสแกนใหม่สำหรับจอยสติ๊ก และเกมคอนโทรลเลอร์ประกอบด้วย AXIS_HAT_X, AXIS_HAT_Y, AXIS_RTRIGGER, AXIS_ORIENTATION, AXIS_THROTTLE และอีกหลายคน แกน MotionEvent ที่มีอยู่จะแสดงด้วย AXIS_X, AXIS_Y AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR และ AXIS_ORIENTATION

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

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

บางแกนสามารถเรียกดูได้โดยใช้เมธอดตัวเข้าถึงแบบพิเศษ ตัวอย่างเช่น แอปพลิเคชันจะโทรหา getX() แทนการโทรหา getAxisValue() ได้ แกนที่มีตัวเข้าถึงในตัว ได้แก่ AXIS_X, AXIS_Y, AXIS_PRESSURE, AXIS_SIZE, AXIS_TOUCH_MAJOR, AXIS_TOUCH_MINOR, AXIS_TOOL_MAJOR, AXIS_TOOL_MINOR และ AXIS_ORIENTATION

อุปกรณ์อินพุตแต่ละเครื่องจะมีรหัสที่ไม่ซ้ำกัน ซึ่งได้รับจากระบบ และอาจมี แหล่งที่มาหลายแห่ง เมื่ออุปกรณ์ให้แหล่งที่มาหลายแห่ง แหล่งที่มามากกว่า 1 แห่ง สามารถให้ข้อมูลแกนโดยใช้แกนเดียวกันได้ ตัวอย่างเช่น กิจกรรมการแตะที่กำลังจะเกิดขึ้น จากแหล่งสัมผัสจะใช้แกน X สำหรับข้อมูลตำแหน่งหน้าจอ ขณะที่จอยสติ๊ก เหตุการณ์ที่มาจากจอยสติ๊กจะใช้แกน X สำหรับตำแหน่งสติ๊ก แทน ด้วยเหตุนี้ จึงเป็นเรื่องสำคัญที่แอปพลิเคชันจะต้องตีความแกน ตามแหล่งที่มาที่เกิด เมื่อจัดการกับการเคลื่อนไหว แอปพลิเคชันควรใช้เมธอดใน InputDevice เพื่อกำหนดแกนที่อุปกรณ์หรือแหล่งที่มารองรับ กล่าวโดยละเอียดคือ แอปพลิเคชันสามารถใช้ getMotionRanges() เพื่อค้นหาแกนทั้งหมดของอุปกรณ์หรือแกนทั้งหมดของแหล่งที่มาหนึ่งๆ ของอุปกรณ์ ข้อมูลช่วงสำหรับแกนที่แสดงผลในออบเจ็กต์ InputDevice.MotionRange จะระบุแหล่งที่มาของค่าแกนแต่ละค่าในทั้ง 2 กรณี

สุดท้าย ตั้งแต่เหตุการณ์การเคลื่อนไหวจากจอยสติ๊ก เกมแพด เมาส์ และ แทร็กบอลไม่ใช่เหตุการณ์ที่มีการสัมผัส แพลตฟอร์ม ได้เพิ่มเมธอด Callback ใหม่สำหรับ ส่งไปยัง View แบบ "ทั่วไป" เหตุการณ์การเคลื่อนไหว โดยเฉพาะ โดยจะรายงานเหตุการณ์การเคลื่อนไหวแบบไม่ใช่การสัมผัสกับ View ผ่านการโทรหา onGenericMotionEvent() ไม่ใช่ onTouchEvent()

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

หากต้องการดูตัวอย่างแอปพลิเคชันที่ใช้การเคลื่อนที่ของจอยสติ๊ก โปรดดูเหตุการณ์ โปรดดู GameControllerInput และ GameView

API RTP

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

RTP API มีอยู่ในแพ็กเกจ android.net.rtp คลาส รวมข้อมูลต่อไปนี้

  • RtpStream ซึ่งเป็นคลาสพื้นฐานของสตรีมที่ส่งและรับแพ็กเก็ตเครือข่ายที่มีเพย์โหลดสื่อผ่าน RTP
  • AudioStream ซึ่งเป็นคลาสย่อยของ RtpStream ที่ส่งข้อมูลเพย์โหลดเสียงผ่าน RTP
  • AudioGroup ศูนย์กลางเสียงในเครื่องสำหรับจัดการและ กำลังมิกซ์ลำโพง ไมโครโฟน และ AudioStream ของอุปกรณ์
  • AudioCodec ซึ่งมีคอลเล็กชันของตัวแปลงรหัสที่ ที่คุณกำหนดสำหรับ AudioStream

แอปพลิเคชันจะสร้างอินสแตนซ์เพื่อรองรับการประชุมทางเสียงและการใช้งานที่คล้ายกัน 2 คลาสเป็นปลายทางสำหรับสตรีม

  • AudioStream ระบุปลายทางระยะไกลและประกอบด้วย ของการแมปเครือข่าย และ AudioCodec ที่กำหนดค่าไว้
  • AudioGroup แสดงถึงปลายทางในเครื่องสำหรับ 1 AudioStream ขึ้นไป มิกซ์ของ AudioGroup AudioStream ทั้งหมดและโต้ตอบกับอุปกรณ์หรือไม่ก็ได้ ลำโพงและไมโครโฟนพร้อมกัน

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

หากต้องการใช้ RTP API แอปพลิเคชันต้องขอสิทธิ์จากผู้ใช้ภายในวันที่ กำลังประกาศ <uses-permission android:name="android.permission.INTERNET"> ในไฟล์ Manifest คุณต้องมีสิทธิ์ <uses-permission android:name="android.permission.RECORD_AUDIO"> จึงจะรับไมโครโฟนของอุปกรณ์ได้ด้วย

วิดเจ็ตแอปที่ปรับขนาดได้

เริ่มตั้งแต่ Android 3.1 เป็นต้นไป นักพัฒนาซอฟต์แวร์จะสามารถสร้างวิดเจ็ตบนหน้าจอหลักของตน ปรับขนาดได้ — แนวนอน แนวตั้ง หรือในทั้ง 2 แกน ผู้ใช้แตะค้าง วิดเจ็ตเพื่อแสดงแฮนเดิลปรับขนาด จากนั้นลากแนวนอนและ/หรือแนวตั้ง แฮนเดิลเพื่อเปลี่ยนขนาดในตารางเลย์เอาต์

นักพัฒนาซอฟต์แวร์สามารถทำให้วิดเจ็ตบนหน้าจอหลัก ปรับขนาดได้โดยกำหนด resizeMode ในข้อมูลเมตา AppWidgetProviderInfo ของวิดเจ็ต ค่าของแอตทริบิวต์ แอตทริบิวต์ resizeMode ประกอบด้วย "แนวนอน" "แนวตั้ง" และ "ไม่มี" หากต้องการประกาศให้วิดเจ็ตปรับขนาดได้ทั้งในแนวนอนและแนวตั้ง ให้ระบุค่าเป็น "horizontal|vertical"

ตัวอย่างเช่น

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical" >
</appwidget-provider>

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

เฟรมเวิร์กของภาพเคลื่อนไหว

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

      การใช้ ViewPropertyAnimator นั้นไม่ซับซ้อน วิธีทำให้พร็อพเพอร์ตี้สำหรับ View โทรหา animate() ถึง สร้างออบเจ็กต์ ViewPropertyAnimator สำหรับ View นั้น ใช้เมนู ใน ViewPropertyAnimator เพื่อระบุพร็อพเพอร์ตี้ที่จะ ทำอย่างไรให้เป็นภาพเคลื่อนไหว เช่น หากต้องการทำให้ View โปร่งใส ให้เรียกใช้ alpha(0); ออบเจ็กต์ ViewPropertyAnimator จะจัดการรายละเอียดเกี่ยวกับการกำหนดค่าคลาส Animator ที่อยู่เบื้องหลังและเริ่มต้น จากนั้นจึงแสดงผลภาพเคลื่อนไหว

  • สีพื้นหลังของภาพเคลื่อนไหว
    • วิธีการใหม่ getBackgroundColor() และ setBackgroundColor(int) ช่วยให้คุณรับ/ตั้งค่าสีพื้นหลังที่อยู่เบื้องหลังภาพเคลื่อนไหวได้สำหรับภาพเคลื่อนไหวของหน้าต่างเท่านั้น ปัจจุบันพื้นหลังต้องเป็นสีดำโดยมีระดับอัลฟ่าตามที่ต้องการ
  • กำลังรับเศษส่วนที่เคลื่อนไหวจาก ViewAnimator
    • getAnimatedFraction()รายการใหม่ วิธีการ ช่วยให้คุณรับเศษส่วนปัจจุบันของภาพเคลื่อนไหว ซึ่งก็คือส่วนที่ผ่าน/แปลไปแล้ว เศษส่วนที่ใช้ในการอัปเดตเฟรมครั้งล่าสุด — จาก ValueAnimator

เฟรมเวิร์ก UI

  • การบังคับการแสดงผลของเลเยอร์
    • เมธอด buildLayer() ใหม่ช่วยให้แอปพลิเคชัน บังคับให้สร้างเลเยอร์ของมุมมองและแสดงผลมุมมองลงในเลเยอร์นั้นทันที ตัวอย่างเช่น แอปพลิเคชันสามารถใช้เมธอดนี้เพื่อแสดงผลมุมมองลงใน ก่อนเริ่มภาพเคลื่อนไหว หากมุมมองมีความซับซ้อน จะแสดงผลเป็น เลเยอร์ก่อนเริ่มภาพเคลื่อนไหวจะหลีกเลี่ยงการข้ามเฟรม
  • ระยะห่างของกล้อง
    • แอปพลิเคชันสามารถใช้วิธีการใหม่ได้ setCameraDistance(float) เพื่อกำหนดระยะห่างจาก กล้อง ไปยังข้อมูลพร็อพเพอร์ตี้ วิธีนี้จะช่วยให้แอปพลิเคชันควบคุมการเปลี่ยนรูปแบบ 3 มิติของ มุมมอง เช่น การหมุน
  • กำลังเรียกดูมุมมองปฏิทินจาก Date Picker
  • การรับ Callback เมื่อมีการแยกข้อมูลพร็อพเพอร์ตี้ออก
  • Listener เบรดครัมบ์ Fragment, ลายเซ็น onInflate() ใหม่
    • วิธีการใหม่ setOnBreadCrumbClickListener() เป็นฮุกที่ทำให้ จะสกัดกั้นการคลิกเบรดครัมบ์แบบแยกส่วนและดำเนินการที่จำเป็น ก่อนที่จะไปยังรายการหรือส่วนย่อยที่ถูกคลิก
    • ในชั้นเรียน Fragment เราเลิกใช้งาน onInflate(attrs, savedInstanceState) แล้ว โปรดใช้ onInflate(activity, attrs, savedInstanceState) แทน
  • แสดงผลการค้นหาในแท็บใหม่
    • คีย์ข้อมูล EXTRA_NEW_SEARCH สำหรับ Intent ACTION_WEB_SEARCH ช่วยให้คุณเปิดการค้นหาใน แท็บเบราว์เซอร์ใหม่ แทนในแท็บที่มีอยู่
  • เคอร์เซอร์ข้อความที่วาดได้
    • ตอนนี้คุณสามารถระบุที่ถอนออกได้เพื่อใช้เป็นเคอร์เซอร์ข้อความแล้วโดยใช้ แอตทริบิวต์ทรัพยากร textCursorDrawable
  • การตั้งค่าเด็กที่แสดงในมุมมองจากระยะไกล
  • คีย์ทั่วไปสำหรับเกมแพดและอุปกรณ์อินพุตอื่นๆ
    • KeyEvent จะเพิ่มคีย์โค้ดทั่วไปที่หลากหลายเพื่อรองรับปุ่มของเกมแพด ชั้นเรียนยังเพิ่ม isGamepadButton(int) และอีกหลายรายการ เมธอดตัวช่วยในการทำงานกับรหัสคีย์

กราฟิก

  • ตัวช่วยสำหรับการจัดการบิตแมป
    • setHasAlpha(boolean) ช่วยให้แอประบุว่า เป็นที่ทราบว่าพิกเซลทั้งหมดในบิตแมปเป็นแบบทึบ (เท็จ) หรือบางส่วน พิกเซลอาจมีค่าอัลฟ่าที่ไม่ทึบแสง (จริง) โปรดทราบว่าสำหรับการกำหนดค่าบางรายการ (เช่น เป็น RGB_565) การเรียกนี้จะไม่มีผล เนื่องจากไม่รองรับอัลฟ่าต่อพิกเซล วิธีนี้ใช้เป็นแนวทางการวาด เช่นในบางกรณี บิตแมปที่เป็นที่รู้จัก การเป็นแบบทึบสามารถใช้กรอบการเขียนได้เร็วกว่าแบบที่ไม่ทึบแสง ค่าอัลฟ่าต่อพิกเซล
    • getByteCount() รับขนาดของบิตแมปใน ไบต์
    • getGenerationId() ช่วยให้แอปพลิเคชันค้นหา ดูว่ามีการแก้ไขบิตแมปหรือไม่ เช่น สำหรับการแคช
    • sameAs(android.graphics.Bitmap) จะกำหนดว่าบิตแมปหนึ่งๆ แตกต่างจากบิตแมปปัจจุบันหรือไม่ ไม่ว่าจะเป็นมิติข้อมูล การกำหนดค่า หรือข้อมูลพิกเซล
  • การตั้งค่าตำแหน่งและการหมุนของกล้อง
    • Camera เพิ่มสองเมธอดใหม่ rotate() และ setLocation() สำหรับ การควบคุมของ ตําแหน่งของกล้องสำหรับการแปลงเป็น 3 มิติ

เครือข่าย

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

      หากต้องการสร้างการล็อกประสิทธิภาพสูง ให้ส่ง WIFI_MODE_FULL_HIGH_PERF เป็นโหมดล็อกใน โทรหา createWifiLock()

  • สถิติการเข้าชมเพิ่มเติม
    • ขณะนี้แอปพลิเคชันสามารถเข้าถึงสถิติการใช้งานเครือข่ายประเภทต่างๆ ได้มากขึ้นแล้ว โดยใช้วิธีการใหม่ใน TrafficStats แอปพลิเคชันสามารถใช้เมธอดดังกล่าวเพื่อรับสถิติ UDP, จํานวนแพ็กเก็ต, ไบต์เพย์โหลดที่ส่ง/รับ TCP และกลุ่มสําหรับ UID ที่ระบุ
  • ชื่อผู้ใช้สำหรับการตรวจสอบสิทธิ์ SIP
    • ตอนนี้แอปพลิเคชันสามารถรับและตั้งค่าชื่อผู้ใช้สำหรับการให้สิทธิ์ SIP ของโปรไฟล์ได้โดยใช้เมธอดใหม่ getAuthUserName() และ setAuthUserName()

ตัวจัดการการดาวน์โหลด

  • การจัดการการดาวน์โหลดที่เสร็จสมบูรณ์
    • ตอนนี้แอปพลิเคชันสามารถเริ่มการดาวน์โหลดที่แจ้งเตือนผู้ใช้เฉพาะบน อัตโนมัติ ในการเริ่มต้นการดาวน์โหลดประเภทนี้ แอปพลิเคชันจะส่ง VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION ในเมธอด setNotificationVisibility() ของ อ็อบเจกต์คำขอ
    • วิธีการใหม่อย่าง addCompletedDownload() ช่วยให้แอปพลิเคชันเพิ่มไฟล์ลงในฐานข้อมูลการดาวน์โหลดได้ เพื่อให้แอปพลิเคชันการดาวน์โหลดจัดการไฟล์ได้
  • แสดงการดาวน์โหลดที่จัดเรียงตามขนาด
    • แอปพลิเคชันสามารถเริ่มการทำงานของแอปพลิเคชันดาวน์โหลดในโหมดจัดเรียงตามขนาดได้โดย การเพิ่ม INTENT_EXTRAS_SORT_BY_SIZE รายการใหม่ลงใน Intent ACTION_VIEW_DOWNLOADS

เฟรมเวิร์ก IME

  • การรับคีย์ค่าพิเศษของวิธีการป้อนข้อมูล
    • InputMethodSubtype จะเพิ่ม วิธีการ containsExtraValueKey() เพื่อดูว่ามีการจัดเก็บสตริง ExtraValue หรือไม่ สำหรับประเภทย่อยและ เมธอด getExtraValueOf() เพื่อดึงค่าคีย์ที่เฉพาะเจาะจงจากแฮชแมป ExtraValue

สื่อ

  • รูปแบบเสียงสตรีมมิงใหม่
    • เฟรมเวิร์กสื่อเพิ่มการรองรับในตัวสำหรับเนื้อหา AAC ดิบของ ADTS สำหรับ เสียงสตรีมที่ได้รับการปรับปรุง รวมถึงการรองรับเสียง FLAC เพื่อคุณภาพสูงสุด เนื้อหาเสียงที่บีบอัด (แบบไม่สูญเสียรายละเอียด) ดูข้อมูลเพิ่มเติมในเอกสารรูปแบบสื่อที่รองรับ

เปิดตัวควบคุมเมื่อหยุด แอปพลิเคชัน

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

โปรดทราบว่าสถานะหยุดของแอปพลิเคชันจะไม่เหมือนกัน สถานะหยุด ระบบจะจัดการสถานะหยุดทั้งสองแบบแยกกัน

แพลตฟอร์มจะกำหนดแฟล็ก Intent ใหม่ 2 รายการเพื่อให้ผู้ส่งระบุได้ ควรอนุญาตให้ Intent เปิดใช้งานคอมโพเนนต์ใน "หยุด" หรือไม่ แอปพลิเคชัน

  • FLAG_INCLUDE_STOPPED_PACKAGES - รวมตัวกรอง Intent ของแอปพลิเคชันที่หยุดทำงานแล้วในรายการเป้าหมายที่เป็นไปได้ เพื่อแก้ไข
  • FLAG_EXCLUDE_STOPPED_PACKAGES - ไม่รวมตัวกรอง Intent ของแอปพลิเคชันที่หยุดแล้วจากรายการ เป้าหมาย

เมื่อไม่ได้กําหนดแฟล็กเหล่านี้ใน Intent หรือกําหนดทั้ง 2 รายการ ลักษณะการทํางานเริ่มต้นจะรวมตัวกรองของแอปพลิเคชันที่หยุดทำงานไว้ในรายการเป้าหมายที่เป็นไปได้

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

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

การแจ้งเตือนการเปิดตัวและการอัปเกรดแอปพลิเคชันครั้งแรก

แพลตฟอร์มจะเพิ่มการแจ้งเตือนที่ปรับปรุงแล้วเกี่ยวกับการเปิดใช้งานครั้งแรกและการอัปเกรดแอปพลิเคชันผ่านการดำเนินการตาม Intent ใหม่ 2 รายการต่อไปนี้

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

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

ยูทิลิตีหลัก

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

WebKit

  • คุกกี้รูปแบบไฟล์
    • ตอนนี้ CookieManager รองรับคุกกี้ที่ใช้ เวลา รูปแบบ URI file: คุณสามารถใช้ setAcceptFileSchemeCookies() เพื่อ เปิด/ปิดใช้การรองรับคุกกี้รูปแบบไฟล์ก่อนสร้างอินสแตนซ์ ของ WebView หรือ CookieManager ในCookieManagerอินสแตนซ์ คุณสามารถตรวจสอบว่าเปิดใช้คุกกี้รูปแบบไฟล์หรือไม่โดยเรียกใช้ allowFileSchemeCookies()
  • การแจ้งเตือนคำขอเข้าสู่ระบบ
    • เพื่อรองรับฟีเจอร์การเข้าสู่ระบบอัตโนมัติของเบราว์เซอร์ที่เปิดตัวใน Android 3.0 วิธี onReceivedLoginRequest() แบบใหม่จะแจ้งให้แอปพลิเคชันโฮสต์ทราบว่าระบบประมวลผลคําขอเข้าสู่ระบบอัตโนมัติสําหรับผู้ใช้แล้ว
  • ชั้นเรียนและอินเทอร์เฟซที่นำออก
    • ระบบนําคลาสและอินเทอร์เฟซหลายรายการออกจาก API สาธารณะแล้ว หลังจากที่ก่อนหน้านี้อยู่ในสถานะเลิกใช้งาน โปรดดู API รายงานความแตกต่างสำหรับข้อมูลเพิ่มเติม

เบราว์เซอร์

แอปพลิเคชันเบราว์เซอร์เพิ่มฟีเจอร์ต่อไปนี้เพื่อรองรับการใช้เว็บ แอปพลิเคชัน:

  • การรองรับการเล่นวิดีโอแบบอินไลน์ที่ฝังอยู่ในแท็ก HTML5 <video> การเล่นจะมีการเร่งฮาร์ดแวร์เมื่อเป็นไปได้
  • การสนับสนุนเลเยอร์สำหรับเอลิเมนต์ที่มีตำแหน่งคงที่สำหรับทุกไซต์ (อุปกรณ์เคลื่อนที่และ เดสก์ท็อป)

ค่าคงที่ของฟีเจอร์ใหม่

แพลตฟอร์มนี้เพิ่มค่าคงที่ของฟีเจอร์ฮาร์ดแวร์ใหม่ๆ ที่นักพัฒนาแอปประกาศได้ ในไฟล์ Manifest ของแอปพลิเคชันเพื่อแจ้งแก่บุคคลภายนอก เช่น Google เล่นข้อกำหนดของแอปพลิเคชันสำหรับความสามารถใหม่ของฮาร์ดแวร์ที่รองรับ ในแพลตฟอร์มเวอร์ชันนี้ นักพัฒนาแอปประกาศฟีเจอร์เหล่านี้และฟีเจอร์อื่นๆ ค่าคงที่ในองค์ประกอบไฟล์ Manifest <uses-feature>

  • android.hardware.usb.accessory — แอปพลิเคชันใช้สาย USB API ในการสื่อสารกับอุปกรณ์ฮาร์ดแวร์ภายนอกที่เชื่อมต่อผ่าน USB และ ทำหน้าที่เป็นโฮสต์
  • android.hardware.usb.host — แอปพลิเคชันใช้ USB API เพื่อสื่อสารกับอุปกรณ์ฮาร์ดแวร์ภายนอกที่เชื่อมต่อผ่าน USB และทำหน้าที่เป็น อุปกรณ์

Google Play จะกรองแอปพลิเคชันตามฟีเจอร์ที่ประกาศไว้ในองค์ประกอบไฟล์ Manifest ของ <uses-feature> สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ หากประกาศฟีเจอร์ในไฟล์ Manifest ของแอปพลิเคชัน โปรดอ่านที่Google Play ตัวกรอง

รายงานความแตกต่างของ API

สำหรับมุมมองโดยละเอียดของการเปลี่ยนแปลง API ทั้งหมดใน Android 3.1 (API ระดับ 12) โปรดดู API รายงานความแตกต่าง

ระดับ API

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

หากต้องการใช้ API ที่เปิดตัวใน Android 3.1 ในแอปพลิเคชันของคุณ คุณจะต้องรวบรวมแอปพลิเคชันกับไลบรารี Android ซึ่งมีให้ไว้ใน แพลตฟอร์ม Android 3.1 SDK คุณอาจต้องเพิ่มแอตทริบิวต์ android:minSdkVersion="12" ลงในองค์ประกอบ <uses-sdk> ในไฟล์ Manifest ของแอปพลิเคชันด้วย ทั้งนี้ขึ้นอยู่กับความต้องการ

สำหรับข้อมูลเพิ่มเติม โปรดอ่าน API คืออะไร ระดับ