API ของ Android 4.0

ระดับ API: 14

Android 4.0 (ICE_CREAM_SANDWICH) เป็นการเปิดตัวแพลตฟอร์มหลักที่เพิ่มฟีเจอร์ใหม่ๆ มากมายให้แก่ผู้ใช้และแอป นอกจากฟีเจอร์ใหม่และ API ทั้งหมดที่กล่าวถึงด้านล่างแล้ว Android 4.0 ก็สำคัญ ที่เปิดตัวแพลตฟอร์มเนื่องจากมี API และธีมโฮโลกราฟที่หลากหลายจาก Android 3.x ไปจนถึงหน้าจอขนาดเล็ก ในฐานะนักพัฒนาแอป ตอนนี้คุณมีแพลตฟอร์มเดียวและเฟรมเวิร์ก API แบบรวม ที่ช่วยให้คุณสามารถพัฒนาและเผยแพร่แอปพลิเคชันด้วย APK เดียวที่ให้ เพิ่มประสิทธิภาพประสบการณ์ของผู้ใช้สำหรับโทรศัพท์มือถือ แท็บเล็ต และอื่นๆ เมื่อใช้ Android - Android 4.0 (API ระดับ 14) ขึ้นไป

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

ภาพรวมของ API

ส่วนต่างๆ ด้านล่างจะแสดงภาพรวมทางเทคนิคของ API ใหม่ใน Android 4.0

API โซเชียลในผู้ให้บริการรายชื่อติดต่อ

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

โปรไฟล์ผู้ใช้

ขณะนี้ Android มีโปรไฟล์ส่วนตัวที่แสดงถึงเจ้าของอุปกรณ์ตามที่กำหนดโดย ตาราง ContactsContract.Profile แอปโซเชียลที่คงตัวตนของผู้ใช้ มีส่วนร่วมกับข้อมูลโปรไฟล์ของผู้ใช้ได้โดยการสร้างรายการ ContactsContract.RawContacts ใหม่ภายใน ContactsContract.Profile กล่าวคือ รายชื่อติดต่อดิบที่แสดงถึงอุปกรณ์ที่ผู้ใช้ทำ ไม่อยู่ในตารางข้อมูลติดต่อดิบแบบดั้งเดิมที่กำหนดโดย ContactsContract.RawContacts URI คุณต้องเพิ่มรายชื่อติดต่อข้อมูลดิบของโปรไฟล์ใน โต๊ะที่ CONTENT_RAW_CONTACTS_URI ดิบ ที่อยู่ติดต่อในตารางนี้จะถูกรวมไว้ในโปรไฟล์ที่ผู้ใช้มองเห็นได้หนึ่งโปรไฟล์ ซึ่งมีข้อความว่า "ฉัน"

การเพิ่มข้อมูลติดต่อดิบใหม่สำหรับโปรไฟล์จำเป็นต้องมี สิทธิ์ android.Manifest.permission#WRITE_PROFILE ในทำนองเดียวกัน เพื่อให้อ่านจากโปรไฟล์ได้ คุณต้องขอสิทธิ์ android.Manifest.permission#READ_PROFILE อย่างไรก็ตาม แอปส่วนใหญ่ไม่จำเป็นต้องอ่านโปรไฟล์ผู้ใช้ แม้จะให้ข้อมูลเกี่ยวกับ โปรไฟล์ การอ่านโปรไฟล์ผู้ใช้เป็นสิทธิ์ที่มีความละเอียดอ่อนและคุณควรคาดหวังว่าผู้ใช้จะได้รับ แอปที่ขอแอปดังกล่าว

เชิญชวนความตั้งใจ

การดำเนินการ INVITE_CONTACT ของ Intent ช่วยให้แอป เพื่อเรียกใช้การดำเนินการที่บ่งชี้ว่าผู้ใช้ต้องการเพิ่มรายชื่อติดต่อลงในโซเชียลเน็ตเวิร์ก แอป การรับแอปพลิเคชันจะใช้แอปพลิเคชันเพื่อเชิญผู้ติดต่อที่ระบุให้เข้าร่วม เครือข่ายสังคม แอปส่วนใหญ่จะอยู่ฝั่งรับของการดำเนินการนี้ ตัวอย่างเช่น พารามิเตอร์ แอป People ในตัวเรียกใช้ความตั้งใจในการเชิญเมื่อผู้ใช้เลือก "เพิ่มการเชื่อมต่อ" สำหรับ แอปโซเชียลที่แสดงในรายละเอียดการติดต่อของบุคคล

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

รูปภาพขนาดใหญ่

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

ความคิดเห็นเกี่ยวกับการใช้งานรายชื่อติดต่อ

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

ผู้ให้บริการปฏิทิน

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

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

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

  • ตาราง CalendarContract.Calendars จะมีข้อมูลเฉพาะปฏิทิน แต่ละแถวในตารางนี้จะมีรายละเอียดสำหรับปฏิทินเดียว เช่น ชื่อ สี ข้อมูลการซิงค์ และอื่นๆ
  • ตาราง CalendarContract.Events มีข้อมูลเฉพาะเหตุการณ์ แต่ละแถวในตารางนี้มีข้อมูลสำหรับกิจกรรมเดียว เช่น ชื่อกิจกรรม สถานที่ เวลาเริ่มต้น เวลาสิ้นสุด และอื่นๆ กิจกรรมสามารถเกิดขึ้นครั้งเดียวหรือเกิดซ้ำ หลายครั้ง ระบบจะเก็บผู้เข้าร่วม การช่วยเตือน และพร็อพเพอร์ตี้เพิ่มเติมไว้ในตารางแยกต่างหากและ ใช้ _ID ของกิจกรรมเพื่อลิงก์กับกิจกรรมนั้นๆ
  • ตาราง CalendarContract.Instances มีเวลาเริ่มต้นและเวลาสิ้นสุดสำหรับ การเกิดเหตุการณ์ แต่ละแถวในตารางนี้แสดงรายการเดียว สำหรับกิจกรรมแบบครั้งเดียว มีการแมปอินสแตนซ์กับเหตุการณ์แบบหนึ่งต่อหนึ่ง สำหรับกิจกรรมที่เกิดซ้ำ แถวหลายแถวจะเป็น ที่สร้างขึ้นโดยอัตโนมัติเพื่อให้สอดคล้องกับจำนวนครั้งที่เกิดเหตุการณ์นั้นหลายครั้ง
  • ตาราง CalendarContract.Attendees รองรับผู้เข้าร่วมหรือผู้เข้าร่วมกิจกรรม แต่ละแถวแสดงผู้เข้าร่วมกิจกรรมแต่ละคน ระบุประเภทของแขก บุคคลคือคำตอบ และบุคคลนั้นรับกิจกรรม
  • ตาราง CalendarContract.Reminders จะเก็บข้อมูลการแจ้งเตือน/การแจ้งเตือน แต่ละแถวจะแสดงการแจ้งเตือนรายการเดียวสำหรับเหตุการณ์ กิจกรรมหนึ่งสามารถมีการช่วยเตือนได้หลายรายการ จำนวน การช่วยเตือนต่อกิจกรรมมีการระบุไว้ใน MAX_REMINDERS ซึ่งตั้งค่าโดยอะแดปเตอร์การซิงค์ที่ เป็นเจ้าของปฏิทินที่ระบุ การแจ้งเตือนจะระบุเป็นจำนวนนาทีก่อนที่จะถึงกิจกรรม ตั้งเวลาและระบุวิธีการปลุก เช่น เพื่อใช้การแจ้งเตือน อีเมล หรือ SMS เพื่อช่วยเตือน ผู้ใช้รายนั้น
  • ตาราง CalendarContract.ExtendedProperties มีช่องข้อมูลที่ไม่ชัดเจน ที่อะแดปเตอร์การซิงค์ใช้ ผู้ให้บริการจะไม่ดำเนินการใดๆ กับรายการในตารางนี้ ยกเว้นการลบ เมื่อลบกิจกรรมที่เกี่ยวข้องออก

หากต้องการเข้าถึงข้อมูลปฏิทินของผู้ใช้ด้วยผู้ให้บริการปฏิทิน แอปพลิเคชันของคุณต้องส่งคำขอ สิทธิ์ READ_CALENDAR (สำหรับสิทธิ์การอ่าน) และ WRITE_CALENDAR (สำหรับสิทธิ์เขียน)

ความตั้งใจของเหตุการณ์

หากต้องการแค่เพิ่มกิจกรรมลงในปฏิทินของผู้ใช้ คุณสามารถใช้ Intent ACTION_INSERT กับข้อมูลที่กำหนดโดย Events.CONTENT_URI เพื่อเริ่ม กิจกรรมในแอปปฏิทินที่สร้างกิจกรรมใหม่ การใช้ Intent และคุณสามารถระบุรายละเอียดของกิจกรรมพร้อมกับบริการเสริมต่อไปนี้

  • Events.TITLE: ชื่อของ กิจกรรม
  • CalendarContract.EXTRA_EVENT_BEGIN_TIME: เวลาเริ่มต้นของเหตุการณ์เป็นมิลลิวินาทีจาก Epoch
  • CalendarContract.EXTRA_EVENT_END_TIME: เหตุการณ์ เวลาสิ้นสุดเป็นมิลลิวินาทีจาก Epoch
  • Events.EVENT_LOCATION: สถานที่จัดกิจกรรม
  • Events.DESCRIPTION: เหตุการณ์ คำอธิบาย
  • Intent.EXTRA_EMAIL: ที่อยู่อีเมลของผู้ที่ต้องการส่งถึง เชิญ
  • Events.RRULE: การเกิดซ้ำ กฎสำหรับกิจกรรม
  • Events.ACCESS_LEVEL: จัดว่าเป็นกิจกรรมส่วนตัวหรือสาธารณะ
  • Events.AVAILABILITY: ระยะเวลาของกิจกรรมนี้อนุญาตให้กำหนดกิจกรรมอื่นๆ ในเวลาเดียวกันได้หรือไม่

ผู้ให้บริการข้อความเสียง

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

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

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

มัลติมีเดีย

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

เอฟเฟกต์สื่อ

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

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

  1. โดยต้องเชื่อมโยงกับรูปภาพพื้นผิว GL_TEXTURE_2D
  2. ต้องมีระดับ mipmap อย่างน้อย 1 ระดับ

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

  1. เรียกใช้ EffectContext.createWithCurrentGlContext() จากบริบท OpenGL ES 2.0
  2. ใช้ EffectContext ที่ส่งกลับเพื่อเรียกใช้ EffectContext.getFactory() ซึ่งแสดงผลอินสแตนซ์ จาก EffectFactory
  3. โทรหา createEffect() เพื่อส่ง ชื่อเอฟเฟกต์จาก @link android.media.effect.Effectfactor} เช่น EFFECT_FISHEYE หรือ EFFECT_VIGNETTE

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

หากต้องการใช้เอฟเฟกต์กับพื้นผิว โปรดโทร apply() ใน Effect และส่งผ่านพื้นผิวอินพุต ความกว้างและความสูง และเอาต์พุต ของ Google พื้นผิวอินพุตต้องเชื่อมโยงกับพื้นผิว GL_TEXTURE_2D รูปภาพ (โดยปกติจะทำโดยการเรียก glTexImage2D() ) คุณอาจระบุระดับ Mipmap หลายระดับ หากพื้นผิวเอาต์พุตยังไม่ได้เชื่อมโยงกับ รูปภาพพื้นผิวจะถูกเชื่อมโยงโดยอัตโนมัติด้วยเอฟเฟ็กต์เป็น GL_TEXTURE_2D และระดับ mipmap 1 ระดับ (0) ซึ่งจะมีค่าเท่ากัน เป็นขนาดอินพุต

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

ไคลเอ็นต์รีโมตคอนโทรล

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

หากต้องการเปิดใช้งานไคลเอ็นต์รีโมตคอนโทรลสำหรับมีเดียเพลเยอร์ ให้สร้างอินสแตนซ์ RemoteControlClient ด้วยตัวสร้าง โดยส่ง PendingIntent ที่ประกาศ ACTION_MEDIA_BUTTON Intent ต้องประกาศคอมโพเนนต์ BroadcastReceiver ที่ชัดแจ้งในแอปที่จัดการเหตุการณ์ ACTION_MEDIA_BUTTON ด้วย

หากต้องการประกาศว่าอินพุตตัวควบคุมสื่อใดที่โปรแกรมเล่นของคุณจัดการได้ คุณต้องเรียกใช้ setTransportControlFlags() บน RemoteControlClient ส่งผ่านชุด FLAG_KEY_MEDIA_* Flag เช่น FLAG_KEY_MEDIA_PREVIOUS และ FLAG_KEY_MEDIA_NEXT

จากนั้นคุณต้องลงทะเบียน RemoteControlClient โดยส่งต่อไปยัง MediaManager.registerRemoteControlClient() เมื่อลงทะเบียนแล้ว Broadcast Receiver ที่คุณประกาศเมื่อสร้างอินสแตนซ์ RemoteControlClient จะได้รับ ACTION_MEDIA_BUTTON เหตุการณ์เมื่อกดปุ่มจากรีโมตคอนโทรล Intent ที่คุณได้รับมี KeyEvent สำหรับคีย์สื่อที่กดอยู่ ซึ่งคุณสามารถดึงข้อมูลจาก Intent ด้วย getParcelableExtra(Intent.EXTRA_KEY_EVENT)

หากต้องการแสดงข้อมูลเกี่ยวกับสื่อที่เล่นบนรีโมตคอนโทรล ให้โทรหา editMetaData() และเพิ่มข้อมูลเมตาไปยังกล่องที่ส่งกลับ RemoteControlClient.MetadataEditor คุณสามารถใส่บิตแมป สำหรับอาร์ตเวิร์กของสื่อ ข้อมูลตัวเลข เช่น เวลาที่ผ่านไปและข้อมูลข้อความ เช่น ชื่อแทร็ก สำหรับ ข้อมูลเกี่ยวกับคีย์ที่ใช้ได้ โปรดดูแฟล็ก METADATA_KEY_* ใน MediaMetadataRetriever

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

มีเดียเพลเยอร์

  • ตอนนี้การสตรีมสื่อออนไลน์จาก MediaPlayer ต้องใช้สิทธิ์ INTERNET หากคุณใช้ MediaPlayer เพื่อ เล่นเนื้อหาจากอินเทอร์เน็ต อย่าลืมเพิ่ม INTERNET การขออนุญาตไฟล์ Manifest ของคุณ มิฉะนั้น การเล่นสื่อของคุณจะไม่สามารถใช้งานได้ตั้งแต่ Android 4.0
  • setSurface() อนุญาตให้คุณกำหนด Surface ให้ทำงานเป็นซิงก์วิดีโอ
  • setDataSource() ช่วยให้คุณทำสิ่งต่อไปนี้ได้ ส่งส่วนหัว HTTP เพิ่มเติมไปกับคำขอของคุณ ซึ่งอาจเป็นประโยชน์สำหรับสตรีมมิงแบบสดของ HTTP(S)
  • ตอนนี้สตรีมมิงแบบสดของ HTTP(S) ดำเนินการตามคุกกี้ HTTP ในคำขอต่างๆ แล้ว

ประเภทสื่อ

Android 4.0 เพิ่มการสนับสนุนสำหรับ

  • โปรโตคอลสตรีมมิงแบบสด HTTP/HTTPS เวอร์ชัน 3
  • การเข้ารหัสเสียง AAC ดิบ ADTS
  • รูปภาพ WEBP
  • วิดีโอ Matroska

สําหรับข้อมูลเพิ่มเติม โปรดดูที่สื่อที่รองรับ รูปแบบ

กล้อง

คลาส Camera มี API สำหรับการตรวจจับใบหน้าและการควบคุมอยู่แล้ว มุ่งเน้นและวัดผล

การตรวจจับใบหน้า

ตอนนี้แอปกล้องถ่ายรูปเพิ่มความสามารถได้ด้วย API การตรวจจับใบหน้าของ Android ซึ่งไม่ ตรวจจับเฉพาะใบหน้าของบุคคล แต่รวมถึงลักษณะของใบหน้าบางอย่าง เช่น ตาและปาก

หากต้องการตรวจจับใบหน้าในแอปพลิเคชันกล้อง คุณต้องลงทะเบียน Camera.FaceDetectionListener โดยโทรหา setFaceDetectionListener() จากนั้นคุณจะสามารถเริ่ม พื้นผิวกล้องและเริ่มตรวจจับใบหน้าโดยโทรหา startFaceDetection()

เมื่อระบบตรวจพบใบหน้าอย่างน้อย 1 รายการในฉากของกล้อง ระบบจะเรียก Callback onFaceDetection() ใน การใช้ Camera.FaceDetectionListener รวมถึงอาร์เรย์ของ ออบเจ็กต์ Camera.Face รายการ

อินสแตนซ์ของคลาส Camera.Face ให้ข้อมูลที่หลากหลายเกี่ยวกับ ใบหน้าที่ตรวจพบ ได้แก่

  • Rect ที่ระบุขอบเขตของใบหน้าที่สัมพันธ์กับกล้อง ขอบเขตการมองเห็นปัจจุบัน
  • จำนวนเต็มระหว่าง 1 ถึง 100 ที่บ่งชี้ว่าระบบมั่นใจเพียงใดว่าออบเจ็กต์นั้น ใบหน้ามนุษย์
  • รหัสที่ไม่ซ้ำกันเพื่อให้ติดตามหลายใบหน้าได้
  • วัตถุ Point หลายรายการที่ระบุตำแหน่งของตาและปาก ทราบตำแหน่งแล้ว

หมายเหตุ: การตรวจจับใบหน้าอาจไม่รองรับในบางอุปกรณ์ ดังนั้น คุณควรตรวจสอบโดยโทรไปที่ getMaxNumDetectedFaces() และตรวจสอบว่า มีค่ามากกว่าศูนย์ อุปกรณ์บางรุ่นอาจไม่รองรับการระบุตาและปาก ในกรณีนี้ ช่องเหล่านั้นในออบเจ็กต์ Camera.Face จะเป็นค่าว่าง

จุดมุ่งเน้นและการจำกัดปริมาณ

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

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

หากต้องการระบุจุดโฟกัสหรือการตรวจสอบการใช้งาน เพียงโทรหา setFocusAreas() หรือ setMeteringAreas() แต่ละรายการนำออบเจ็กต์ List จาก Camera.Area รายการที่ระบุพื้นที่ที่ควรพิจารณา เพื่อโฟกัสหรือตรวจสอบการใช้งาน ตัวอย่างเช่น คุณอาจใช้ฟีเจอร์ที่ช่วยให้ผู้ใช้ตั้งค่า พื้นที่โฟกัสโดยแตะพื้นที่ของตัวอย่าง ซึ่งจะมีการแปลเป็นวัตถุ Camera.Area และขอให้กล้องโฟกัสที่บริเวณนั้นของฉาก โฟกัสหรือการรับแสงในบริเวณนั้นจะอัปเดตอย่างต่อเนื่องเมื่อฉากในพื้นที่เปลี่ยนแปลง

โฟกัสอัตโนมัติต่อเนื่องสำหรับรูปภาพ

คุณเปิดใช้การโฟกัสอัตโนมัติแบบต่อเนื่อง (CAF) เมื่อถ่ายภาพได้แล้ว วิธีเปิดใช้ CAF ใน แอปกล้องถ่ายรูป ผ่าน FOCUS_MODE_CONTINUOUS_PICTURE ไปยัง setFocusMode() เมื่อพร้อมจับภาพ รูปภาพ โทรหา autoFocus() Camera.AutoFocusCallback ของคุณจะได้รับการโทรกลับทันทีเพื่อระบุว่า โฟกัสได้สำเร็จ หากต้องการกลับมาใช้ CAF อีกครั้งหลังจากได้รับการติดต่อกลับ คุณต้องโทรหา cancelAutoFocus()

หมายเหตุ: ระบบยังรองรับการโฟกัสอัตโนมัติต่อเนื่องขณะจับภาพด้วย วิดีโอโดยใช้ FOCUS_MODE_CONTINUOUS_VIDEO เพิ่มเข้ามาใน API ระดับ 9

ฟีเจอร์อื่นๆ ของกล้อง

  • ขณะบันทึกวิดีโอ ตอนนี้คุณสามารถโทรหา takePicture() เพื่อบันทึกรูปภาพโดยไม่ขัดจังหวะเซสชันวิดีโอได้แล้ว แต่ก่อนที่จะดำเนินการ คุณควร โทรหา isVideoSnapshotSupported() เพื่อตรวจสอบฮาร์ดแวร์ ก็รองรับ
  • คุณสามารถล็อกการรับแสงอัตโนมัติและไวท์บาลานซ์ด้วย setAutoExposureLock() และ setAutoWhiteBalanceLock() เพื่อป้องกัน คุณสมบัติเหล่านี้ไม่ให้เปลี่ยนแปลง
  • ตอนนี้คุณโทรหา setDisplayOrientation() ระหว่างที่กล้องแสดงตัวอย่างได้แล้ว ก่อนหน้านี้ คุณสามารถเรียกใช้ ก่อนเริ่มการแสดงตัวอย่างเท่านั้น แต่ตอนนี้คุณสามารถเปลี่ยนการวางแนวได้ทุกเมื่อ

ความตั้งใจในการออกอากาศจากกล้อง

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

Android Beam (NDEF Push กับ NFC)

Androidบีมเป็นฟีเจอร์ใหม่ของ NFC ที่ช่วยให้คุณสามารถส่งข้อความ NDEF จากอุปกรณ์เครื่องหนึ่งไปยัง อีกแบบหนึ่ง (กระบวนการหรือที่เรียกว่า "NDEF Push") การโอนข้อมูลจะเริ่มต้นเมื่อ อุปกรณ์ที่ใช้ Android ที่สนับสนุน Androidบีมอยู่ในระยะใกล้ (ประมาณ 4 ซม.) โดยปกติแล้วจะมี หลังของพวกเขา ข้อมูลภายในข้อความ NDEF อาจมีข้อมูลใดก็ตามที่คุณต้องการแชร์ ระหว่างอุปกรณ์ได้ด้วย ตัวอย่างเช่น แอป People จะแชร์รายชื่อติดต่อ, YouTube แชร์วิดีโอ และเบราว์เซอร์ แชร์ URL โดยใช้ Androidบีม

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

  • กําหนด NdefMessage รายการเดียวที่จะพุชขณะอยู่ในกิจกรรม:

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

  • กําหนด NdefMessage ที่จะพุช ณ เวลาที่เริ่ม Androidบีม ดังนี้

    ใช้งาน NfcAdapter.CreateNdefMessageCallback โดยที่คุณ การนำ createNdefMessage() จะแสดงผล NdefMessage ที่คุณต้องการส่ง จากนั้นส่งการติดตั้งใช้งาน NfcAdapter.CreateNdefMessageCallback ไปยัง setNdefPushMessageCallback()

    ในกรณีนี้ เมื่อมีการเปิดใช้งาน Android Beam ด้วยอุปกรณ์อีกเครื่องหนึ่งในขณะที่กิจกรรมอยู่ใน เบื้องหน้า ระบบจะเรียก createNdefMessage() เพื่อดึงข้อมูล NdefMessage ที่ต้องการส่ง ซึ่งจะช่วยให้คุณกําหนด NdefMessage ให้นําส่งเมื่อมีการเริ่ม Android Beam เท่านั้นในกรณีที่เนื้อหา ของข้อความอาจแตกต่างกันไปตลอดระยะเวลาของกิจกรรม

ในกรณีที่คุณต้องการเรียกใช้โค้ดเฉพาะบางอย่างเมื่อระบบส่ง NDEF ให้คุณเรียบร้อยแล้ว ไปยังอุปกรณ์อีกเครื่อง คุณสามารถใช้ NfcAdapter.OnNdefPushCompleteCallback และตั้งค่าเป็น setNdefPushCompleteCallback() ระบบจะ จากนั้นให้โทรหา onNdefPushComplete() เมื่อมีการส่งข้อความ

ในอุปกรณ์รับ ระบบจะส่งข้อความ NDEF Push ในลักษณะเดียวกับ NFC ทั่วไป แท็กทั้งหมด. ระบบเรียกใช้ Intent ด้วย ACTION_NDEF_DISCOVERED การดำเนินการเพื่อเริ่มกิจกรรม โดยใช้ URL หรือตั้งค่าประเภท MIME ตาม NdefRecord แรกใน NdefMessage สำหรับกิจกรรมที่คุณต้องการ คุณสามารถประกาศตัวกรอง Intent สำหรับ URL หรือประเภท MIME ที่แอปของคุณสนใจได้ สำหรับข้อมูลเพิ่มเติม ข้อมูลเกี่ยวกับการส่งแท็ก โปรดดูคู่มือนักพัฒนาซอฟต์แวร์ NFC

หากต้องการให้ NdefMessage มี URI คุณก็สามารถใช้ Method createUri เพื่อสร้าง NdefRecord ใหม่ตามสตริงหรือออบเจ็กต์ Uri หาก URI คือ รูปแบบพิเศษที่คุณต้องการให้แอปพลิเคชันของคุณได้รับในระหว่างกิจกรรม Android Beam ด้วย คุณสามารถ ควรสร้างตัวกรอง Intent สำหรับกิจกรรมโดยใช้รูปแบบ URI เดียวกันเพื่อรับ ข้อความ NDEF ขาเข้า

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

หากแอปพลิเคชันของคุณไม่ได้ใช้ NFC API ในการรับส่งข้อความพุชแบบ NDEF ระบบของ Android จะจัดเตรียม ลักษณะการทำงานเริ่มต้น: เมื่อแอปพลิเคชันของคุณทำงานอยู่เบื้องหน้าบนอุปกรณ์หนึ่งและ Android Beam เรียกใช้ด้วยอุปกรณ์ที่ใช้ Android อีกเครื่องหนึ่ง จากนั้นอุปกรณ์อีกเครื่องจะได้รับข้อความ NDEF ที่มีการเรียก บันทึกแอปพลิเคชัน Android ที่ระบุแอปพลิเคชันของคุณ หากอุปกรณ์ที่รับมีสัญญาณ ติดตั้งแอปพลิเคชันแล้ว ระบบจะเปิดใช้งาน หากไม่ได้ติดตั้งไว้ Google Play จะเปิดขึ้นและ ผู้ใช้ไปยังแอปพลิเคชันของคุณเพื่อทำการติดตั้ง

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ Android Beam และคุณลักษณะอื่นๆ ของ NFC ได้ในคู่มือนักพัฒนาข้อมูลพื้นฐานของ NFC สำหรับโค้ดตัวอย่าง โดยใช้ Android Beam โปรดดูแท็บ การสาธิตบีม

Wi-Fi P2P

ขณะนี้ Android สนับสนุนการเชื่อมต่อ Wi-Fi แบบเพียร์ทูเพียร์ (P2P) ระหว่างอุปกรณ์ที่ใช้ Android และ อุปกรณ์ประเภทอื่น (เป็นไปตาม Wi-Fi DirectTM ของ Wi-Fi Alliance ของ Wi-Fi Alliance โปรแกรมการรับรอง) โดยไม่ต้องมีฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ต เฟรมเวิร์ก Android มอบ ชุด API ของ Wi-Fi P2P ที่ให้คุณค้นพบและเชื่อมต่อกับอุปกรณ์อื่นๆ เมื่ออุปกรณ์แต่ละเครื่อง สนับสนุน Wi-Fi P2P จากนั้นจะสื่อสารผ่านการเชื่อมต่อที่รวดเร็วในระยะทางที่นานกว่า การเชื่อมต่อบลูทูธ

แพ็กเกจใหม่ android.net.wifi.p2p มี API ทั้งหมดสำหรับการทำงานแบบเพียร์ทูเพียร์ เชื่อมต่อกับ Wi-Fi ชั้นเรียนหลักที่คุณจะต้องดำเนินการด้วยคือ WifiP2pManager ซึ่งคุณจะได้รับเมื่อโทรติดต่อ getSystemService(WIFI_P2P_SERVICE) WifiP2pManager มี API ที่ให้คุณทำสิ่งต่อไปนี้ได้

  • เริ่มต้นแอปพลิเคชันสำหรับการเชื่อมต่อแบบ P2P โดยโทรไปที่ initialize()
  • ค้นหาอุปกรณ์ที่อยู่ใกล้เคียงโดยโทรหา discoverPeers()
  • เริ่มการเชื่อมต่อ P2P โดยโทรหา connect()
  • และอื่นๆ

นอกจากนี้ ยังมีอินเทอร์เฟซและคลาสอื่นๆ อีกมากมายที่จำเป็น เช่น

  • อินเทอร์เฟซ WifiP2pManager.ActionListener ช่วยให้คุณสามารถรับ Callback เมื่อการดำเนินการ เช่น การค้นหาแอปเทียบเท่าหรือการเชื่อมต่อกับบุคคลเหล่านั้นสำเร็จหรือไม่สำเร็จ
  • อินเทอร์เฟซ WifiP2pManager.PeerListListener ช่วยให้คุณได้รับ ข้อมูลเกี่ยวกับแอปเทียบเท่าที่ค้นพบ Callback จะระบุ WifiP2pDeviceList ซึ่งคุณสามารถดึงข้อมูลออบเจ็กต์ WifiP2pDevice สำหรับอุปกรณ์แต่ละเครื่องที่อยู่ภายในช่วงและรับข้อมูล เช่น ชื่ออุปกรณ์, ที่อยู่, ประเภทอุปกรณ์, การกำหนดค่า WPS ที่อุปกรณ์รองรับ และอื่นๆ
  • อินเทอร์เฟซ WifiP2pManager.GroupInfoListener ช่วยให้คุณทำสิ่งต่อไปนี้ได้ ได้รับข้อมูลเกี่ยวกับกลุ่ม P2P Callback จะระบุออบเจ็กต์ WifiP2pGroup ซึ่งให้ข้อมูลกลุ่ม เช่น เจ้าของ, ชื่อเครือข่าย และรหัสผ่าน
  • อินเทอร์เฟซ WifiP2pManager.ConnectionInfoListener ช่วยให้คุณทำสิ่งต่อไปนี้ได้ จะได้รับข้อมูลเกี่ยวกับการเชื่อมต่อปัจจุบัน Callback จะระบุออบเจ็กต์ WifiP2pInfo ซึ่งมีข้อมูล เช่น มีการระบุว่ากลุ่มมีการ และใครคือเจ้าของกลุ่ม

หากต้องการใช้ Wi-Fi P2P API แอปของคุณต้องขอสิทธิ์จากผู้ใช้ดังต่อไปนี้

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET (แม้ว่าในทางเทคนิคแล้วแอปของคุณจะไม่เชื่อมต่อ ไปยังอินเทอร์เน็ต การสื่อสารกับแอปเทียบเท่า P2P แบบ Wi-Fi กับซ็อกเก็ต Java มาตรฐานต้องใช้อินเทอร์เน็ต สิทธิ์)

ระบบ Android ยังเผยแพร่การทำงานต่างๆ หลายอย่างระหว่างกิจกรรม Wi-Fi P2P บางกิจกรรม ดังนี้

ดูข้อมูลเพิ่มเติมในเอกสารประกอบ WifiP2pManager และ ดูที่ การสาธิต Wi-Fi P2P แอปพลิเคชันตัวอย่าง

อุปกรณ์สุขภาพบลูทูธ

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

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

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

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

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

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

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

โหมดสำรวจด้วยการแตะ

ตอนนี้ผู้ใช้ที่สูญเสียการมองเห็นสามารถสำรวจหน้าจอได้ด้วยการแตะแล้วลากนิ้วผ่าน เพื่อฟังเสียงบรรยายของเนื้อหา เนื่องจากโหมดสำรวจด้วยการแตะจะทำงานร่วมกัน เคอร์เซอร์เสมือนจริงช่วยให้โปรแกรมอ่านหน้าจอสามารถระบุข้อความอธิบายได้ในลักษณะเดียวกับหน้าจอ ที่อ่านได้เมื่อผู้ใช้ไปยังส่วนต่างๆ ด้วย D-pad หรือแทร็กบอล โดยการอ่านข้อมูลที่มีให้ โดย android:contentDescription และ setContentDescription() จากการ "วางเมาส์" จำลอง กิจกรรม ดังนั้น โปรดทราบว่าคุณควรระบุข้อความอธิบายสำหรับการดูใน แอปพลิเคชัน โดยเฉพาะสำหรับ ImageButton, EditText ImageView และวิดเจ็ตอื่นๆ ที่อาจไม่มีความหมายตามธรรมชาติ ข้อความ

การช่วยเหลือพิเศษสำหรับการดู

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

โปรดทราบว่าก่อนอื่นลักษณะการทำงานของเมธอด sendAccessibilityEvent() ใน Android มีการเปลี่ยนแปลง 4.0 เมื่อผู้ใช้เปิดใช้บริการการช่วยเหลือพิเศษในอุปกรณ์ เช่นเดียวกับ Android เวอร์ชันก่อนหน้า และเกิดเหตุการณ์อินพุต เช่น การคลิกหรือการวางเมาส์ การแสดงผลที่เกี่ยวข้องจะได้รับการแจ้งเตือนด้วยการเรียก sendAccessibilityEvent() ก่อนหน้านี้ การใช้งาน sendAccessibilityEvent() จะ เริ่มต้น AccessibilityEvent และส่งไปยัง AccessibilityManager ลักษณะการทํางานแบบใหม่นี้ต้องมี Callback เพิ่มเติม เมธอดที่อนุญาตให้มุมมองและระดับบนสุดของมุมมองเพิ่มข้อมูลตามบริบทลงในเหตุการณ์ได้

  1. เมื่อเรียกใช้เมธอด sendAccessibilityEvent() และ sendAccessibilityEventUnchecked() จะเลื่อนเวลา ไปยัง onInitializeAccessibilityEvent()

    การติดตั้งใช้งานที่กําหนดเองของ View อาจต้องการใช้งาน onInitializeAccessibilityEvent() เพื่อ โปรดแนบข้อมูลการช่วยเหลือพิเศษเพิ่มเติมกับ AccessibilityEvent แต่ก็ควรเรียกใช้การติดตั้งใช้งานขั้นสูงด้วย ระบุข้อมูลเริ่มต้น เช่น คำอธิบายเนื้อหามาตรฐาน ดัชนีสินค้า และอื่นๆ อย่างไรก็ตาม คุณไม่ควรเพิ่มเนื้อหาแบบข้อความเพิ่มเติมใน Callback นี้ ซึ่งอาจเกิดขึ้นได้ ถัดไป

  2. เมื่อเริ่มตั้งค่าแล้ว หากเหตุการณ์เป็นหนึ่งในหลายๆ ประเภทที่ควรใส่ข้อความ มุมมองจะได้รับการติดต่อไปยัง dispatchPopulateAccessibilityEvent() ซึ่ง เลื่อนไปที่ onPopulateAccessibilityEvent() Callback

    โดยปกติแล้วการติดตั้งใช้งาน View ที่กำหนดเองควรใช้ onPopulateAccessibilityEvent() เพื่อเพิ่ม เนื้อหาข้อความไปยัง AccessibilityEvent หากไม่มีข้อความ android:contentDescription หรือ ไม่เพียงพอ วิธีเพิ่มข้อความอธิบายในส่วน AccessibilityEvent โทร getText()add()

  3. ในจุดนี้ View จะผ่านเหตุการณ์ขึ้นตามลำดับชั้นการแสดงผลด้วยการเรียกใช้ requestSendAccessibilityEvent() ใน มุมมองหลัก มุมมองของผู้ปกครองแต่ละอันจะมีโอกาสเสริมข้อมูลการช่วยเหลือพิเศษด้วยวิธีต่อไปนี้ กำลังเพิ่มAccessibilityRecord จนกว่าจะ ท้ายที่สุดแล้วจะไปถึงมุมมองรูท ซึ่งจะส่งเหตุการณ์ไปยัง AccessibilityManager ด้วย sendAccessibilityEvent()

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

หากคุณต้องการรักษาความเข้ากันได้กับ Android เวอร์ชันก่อน 4.0 และรองรับ API การเข้าถึงได้ง่ายใหม่ คุณสามารถทำได้ด้วยการสนับสนุน v4 เวอร์ชันล่าสุด ไลบรารี (ในแพ็กเกจความเข้ากันได้, r4) โดยใช้ชุดคลาสยูทิลิตีที่มี API การช่วยเหลือพิเศษใหม่ในลักษณะการทำงานที่เข้ากันได้แบบย้อนหลัง การออกแบบอีกด้วย

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

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

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

  1. เมื่อได้รับ AccessibilityEvent จากแอปพลิเคชัน เรียก AccessibilityEvent.getRecord() เพื่อเรียกข้อมูล AccessibilityRecord เฉพาะ (อาจมีหลายเรคคอร์ดที่แนบมากับ เหตุการณ์)
  2. จาก AccessibilityEvent หรือ AccessibilityRecord แต่ละรายการ คุณสามารถเรียกใช้ getSource() เพื่อเรียกออบเจ็กต์ AccessibilityNodeInfo ได้

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

  3. คุณสามารถใช้ AccessibilityNodeInfo เพื่อค้นหาข้อมูล เกี่ยวกับเส้นทางนี้ โทรหา getParent() หรือ getChild() เพื่อข้ามมุมมอง ลำดับชั้น หรือแม้กระทั่งเพิ่มมุมมองย่อยลงในโหนด

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

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

หากคุณสนใจสถานะการช่วยเหลือพิเศษของอุปกรณ์ AccessibilityManager มี API ใหม่บางส่วน เช่น

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

บริการเครื่องตรวจตัวสะกด

เฟรมเวิร์กโปรแกรมตรวจตัวสะกดใหม่ทำให้แอปสามารถสร้างโปรแกรมตรวจตัวสะกดในลักษณะเดียวกับ เฟรมเวิร์กวิธีการป้อนข้อมูล (สำหรับ IME) หากต้องการสร้างโปรแกรมตรวจตัวสะกดใหม่ คุณต้องใช้บริการที่ ขยาย SpellCheckerServiceและขยายคลาส SpellCheckerService.Session เพื่อให้คำแนะนำการสะกดคำตาม บนข้อความที่ให้ไว้โดยเมธอด Callback ของอินเทอร์เฟซ ในเมธอด Callback SpellCheckerService.Session คุณต้องแสดงผล คำแนะนำการสะกดคำเป็นออบเจ็กต์ SuggestionsInfo รายการ

แอปพลิเคชันที่ให้บริการโปรแกรมตรวจตัวสะกดต้องประกาศสิทธิ์ BIND_TEXT_SERVICE ตามที่บริการกำหนด บริการต้องประกาศตัวกรอง Intent ที่มี <action android:name="android.service.textservice.SpellCheckerService" /> เป็นการดำเนินการของ Intent ด้วย และ รวมเอลิเมนต์ <meta-data> ที่ประกาศข้อมูลการกำหนดค่าสำหรับการสะกดคำ เครื่องมือตรวจสอบ

ดูตัวอย่าง บริการตรวจตัวสะกดและ ตัวอย่าง แอปไคลเอ็นต์เครื่องตรวจตัวสะกดสำหรับโค้ดตัวอย่าง

เครื่องมืออ่านออกเสียงข้อความ

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

การใช้เครื่องมืออ่านออกเสียงข้อความ

ใน Android เวอร์ชันก่อนหน้า คุณสามารถใช้คลาส TextToSpeech ได้ เพื่อทำงานการอ่านออกเสียงข้อความ (TTS) โดยใช้เครื่องมือ TTS ที่ได้รับจากระบบหรือตั้งค่า เครื่องมือที่กำหนดเองโดยใช้ setEngineByPackageName() ใน Android 4.0 ใช้เมธอด setEngineByPackageName() เลิกใช้งานแล้ว และตอนนี้คุณสามารถระบุเครื่องมือเพื่อใช้กับตัวสร้าง TextToSpeech ใหม่ที่ยอมรับชื่อแพ็กเกจของเครื่องมือ TTS

คุณยังค้นหาเครื่องมือ TTS ที่ใช้ได้ด้วย getEngines() ได้ด้วย เมธอดนี้จะแสดงรายการออบเจ็กต์ TextToSpeech.EngineInfo ซึ่งรวมถึงข้อมูลเมตา เช่น ไอคอน ป้ายกำกับ และชื่อแพ็กเกจ

การสร้างเครื่องมืออ่านออกเสียงข้อความ

ก่อนหน้านี้ เครื่องมือที่กำหนดเองกำหนดให้สร้างเครื่องมือโดยใช้ส่วนหัวเนทีฟที่ไม่ได้ระบุไว้ ใน Android 4.0 มีชุด API เฟรมเวิร์กที่สมบูรณ์สำหรับการสร้างเครื่องมือ TTS

การตั้งค่าพื้นฐานต้องใช้ TextToSpeechService ที่ ตอบสนองต่อ Intent INTENT_ACTION_TTS_SERVICE งานหลักสำหรับเครื่องมือ TTS เกิดขึ้นระหว่างการเรียกกลับของ onSynthesizeText() ในบริการ ที่ขยาย TextToSpeechService ระบบจะส่งวิธีนี้แบบ 2 ออบเจ็กต์มีดังนี้

  • SynthesisRequest: ประกอบด้วยข้อมูลที่หลากหลาย รวมถึงข้อความที่จะ สังเคราะห์ ภาษา ความเร็วในการพูด และระดับเสียงสูงต่ำ
  • SynthesisCallback: นี่คืออินเทอร์เฟซที่เครื่องมือ TTS ของคุณ จะส่งข้อมูลเสียงพูดที่ได้ในรูปแบบเสียงสตรีมมิง ก่อนอื่น เครื่องยนต์ต้องโทรหา start() เพื่อระบุว่าเครื่องยนต์พร้อมส่งแล้ว เสียง แล้วโทรไปที่ audioAvailable() ส่งผ่านข้อมูลเสียงในไบต์บัฟเฟอร์ เมื่อเครื่องมือของคุณได้ส่งผ่านเสียงทั้งหมดผ่าน บัฟเฟอร์ โทรหา done()

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

สำหรับเครื่องมือ TTS ตัวอย่างที่ใช้ API ใหม่ โปรดดูแอปตัวอย่าง Text To Speech Engine

การใช้เครือข่าย

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

หากแอปพลิเคชันของคุณดำเนินธุรกรรมเครือข่ายเป็นจำนวนมาก คุณควรระบุการตั้งค่าของผู้ใช้ที่ ช่วยให้ผู้ใช้ควบคุมพฤติกรรมการใช้อินเทอร์เน็ตของแอปได้ เช่น ความถี่ในการซิงค์ข้อมูลของแอป เป็นต้น ดำเนินการอัปโหลด/ดาวน์โหลดเฉพาะเมื่อใช้ Wi-Fi, เลือกว่าจะใช้ข้อมูลขณะโรมมิ่งหรือไม่ เป็นต้น ควบคุมได้น้อย ผู้ใช้จึงมีแนวโน้มน้อยลงมากที่จะปิดการเข้าถึงข้อมูลของแอปเมื่อ ให้เกือบถึงขีดจำกัด เนื่องจากสามารถควบคุมปริมาณอินเทอร์เน็ตที่แอปของคุณใช้ได้อย่างแม่นยำ หากคุณระบุกิจกรรมค่ากำหนดพร้อมด้วยการตั้งค่าเหล่านี้ คุณควรรวมไว้ในไฟล์ Manifest การประกาศตัวกรอง Intent สำหรับ ACTION_MANAGE_NETWORK_USAGE การดำเนินการ เช่น

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

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

และโปรดระวังว่าขณะนี้ getBackgroundDataSetting() เลิกใช้งานแล้วและแสดงผลเป็น "จริง" เสมอ ให้ใช้ getActiveNetworkInfo() แทน ก่อนที่คุณจะลองเครือข่ายใดๆ ธุรกรรม คุณควรโทรหา getActiveNetworkInfo() เสมอ เพื่อรับ NetworkInfo ที่แสดงเครือข่ายปัจจุบันและค้นหา isConnected() เพื่อตรวจสอบว่าอุปกรณ์มี การเชื่อมต่อ จากนั้นคุณตรวจสอบคุณสมบัติการเชื่อมต่ออื่นๆ ได้ เช่น ระบุว่าอุปกรณ์ โรมมิ่งหรือเชื่อมต่อกับ Wi-Fi

องค์กร

Android 4.0 เพิ่มขีดความสามารถให้กับแอปพลิเคชันขององค์กรด้วยคุณลักษณะต่อไปนี้

บริการ VPN

VpnService ใหม่ช่วยให้แอปพลิเคชันสร้าง VPN ของตัวเองได้ เครือข่ายส่วนตัว) ที่ทำงานในฐานะ Service บริการ VPN สร้างอินเทอร์เฟซสำหรับ เครือข่ายเสมือนที่มีที่อยู่และกฎการกำหนดเส้นทางเป็นของตนเอง และจะดำเนินการอ่านและเขียนทั้งหมดด้วย ข้อบ่งชี้ไฟล์

หากต้องการสร้างบริการ VPN ให้ใช้ VpnService.Builder ซึ่งให้คุณระบุได้ ที่อยู่เครือข่าย, เซิร์ฟเวอร์ DNS, เส้นทางเครือข่าย และอื่นๆ เมื่อดำเนินการเสร็จ คุณจะสามารถสร้าง โดยการเรียกใช้ establish() ซึ่งจะแสดง ParcelFileDescriptor

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

นโยบายด้านอุปกรณ์

แอปพลิเคชันที่จัดการการจำกัดอุปกรณ์สามารถปิดใช้กล้องโดยใช้ setCameraDisabled() และพร็อพเพอร์ตี้ USES_POLICY_DISABLE_CAMERA (ใช้กับองค์ประกอบ <disable-camera /> ในไฟล์การกำหนดค่านโยบาย)

การจัดการใบรับรอง

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

เซ็นเซอร์ของอุปกรณ์

มีการเพิ่มเซ็นเซอร์ 2 ประเภทใหม่ใน Android 4.0 ดังนี้

  • TYPE_AMBIENT_TEMPERATURE: เซ็นเซอร์อุณหภูมิที่ให้ อุณหภูมิแวดล้อม (ห้อง) เป็นองศาเซลเซียส
  • TYPE_RELATIVE_HUMIDITY: เซ็นเซอร์วัดความชื้นที่ให้ผลลัพธ์ ความชื้นสัมพัทธ์โดยรอบ (ห้อง) เป็นเปอร์เซ็นต์

หากอุปกรณ์มีทั้งเซ็นเซอร์ TYPE_AMBIENT_TEMPERATURE และ TYPE_RELATIVE_HUMIDITY คุณใช้เซ็นเซอร์ดังกล่าวเพื่อคำนวณจุดน้ำค้างได้ และความชื้นสัมบูรณ์

เซ็นเซอร์อุณหภูมิ TYPE_TEMPERATURE อยู่ก่อนหน้า เลิกใช้งานแล้ว คุณควรใช้เซ็นเซอร์ TYPE_AMBIENT_TEMPERATURE แทน

นอกจากนี้ เซ็นเซอร์สังเคราะห์ 3 ตัวของ Android ได้รับการปรับปรุงอย่างมาก เวลาในการตอบสนองและเอาต์พุตที่ราบรื่นยิ่งขึ้น เซ็นเซอร์เหล่านี้รวมถึงเซ็นเซอร์แรงโน้มถ่วง (TYPE_GRAVITY), เซ็นเซอร์เวกเตอร์การหมุน (TYPE_ROTATION_VECTOR) และเซ็นเซอร์ความเร่งเชิงเส้น (TYPE_LINEAR_ACCELERATION) เซ็นเซอร์ที่ได้รับการปรับปรุงต้องอาศัยเครื่องวัดการหมุน เพื่อปรับปรุงเอาต์พุต เพื่อให้เซ็นเซอร์ปรากฏเฉพาะบนอุปกรณ์ที่มีเครื่องวัดการหมุนเท่านั้น

แถบการดำเนินการ

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

แถบการดำเนินการแยก

หากแถบการดำเนินการมีรายการการทำงานหลายรายการ บางรายการจะไม่พอดีกับแถบการดำเนินการใน หน้าจอที่แคบเพื่อให้ระบบแสดงส่วนเกินไว้ในเมนูรายการเพิ่มเติม อย่างไรก็ตาม Android 4.0 ทำให้คุณสามารถเปิดใช้ “แถบการทำงานแยก" เพื่อให้รายการการทำงานปรากฏบนหน้าจอมากขึ้นใน แยกที่ด้านล่างของหน้าจอ หากต้องการเปิดใช้แถบการทำงานการแยก ให้เพิ่ม android:uiOptions ด้วย "splitActionBarWhenNarrow" ลงใน <application> แท็ก หรือ แท็ก <activity> แต่ละรายการ ในไฟล์ Manifest เมื่อเปิดใช้ ระบบจะเพิ่มแถบเพิ่มเติมที่ด้านล่างของ หน้าจอสำหรับรายการการทำงานทั้งหมดเมื่อหน้าจอแคบ (ไม่มีรายการการทำงานปรากฏใน แถบการดำเนินการ)

หากต้องการใช้แท็บการนำทางที่ ActionBar.Tab API มีให้ แต่ไม่ต้องมีแถบการดำเนินการหลักที่ด้านบน (คุณต้องการให้เฉพาะแท็บปรากฏที่ด้านบน) ให้เปิดใช้งาน แถบการดำเนินการแยกตามที่อธิบายไว้ข้างต้น และยังเรียกใช้ setDisplayShowHomeEnabled(false) เพื่อปิดใช้ ไอคอนแอปพลิเคชันในแถบการทำงาน เมื่อไม่มีอะไรเหลืออยู่ในแถบการทำงานหลัก จะหายไป ด้านซ้ายจะเป็นแท็บการนำทางที่ด้านบน และรายการการทำงานที่ ด้านล่างของหน้าจอ

รูปแบบแถบการดำเนินการ

หากต้องการใช้การจัดรูปแบบที่กำหนดเองกับแถบการทำงาน ให้ใช้คุณสมบัติของรูปแบบใหม่ backgroundStacked และ backgroundSplit เพื่อนำพื้นหลังไปใช้ แบบถอนออกได้หรือสีให้กับแถบซ้อนและแถบแยกตามลำดับ คุณยังสามารถตั้งค่ารูปแบบเหล่านี้ได้ที่ รันไทม์กับ setStackedBackgroundDrawable() และ setSplitBackgroundDrawable()

ผู้ให้บริการการดำเนินการ

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

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

หากต้องการประกาศผู้ให้บริการการดำเนินการสำหรับรายการการทำงาน ให้ใส่ android:actionProviderClass ในองค์ประกอบ <item> สำหรับเมนูตัวเลือกของกิจกรรมที่มีชื่อคลาสของการดำเนินการ เป็นผู้ให้บริการ เช่น

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

ในonCreateOptionsMenu()ของกิจกรรม เมธอด Callback ให้ดึงอินสแตนซ์ของผู้ให้บริการการดำเนินการจากรายการเมนูและตั้งค่า ความตั้งใจ:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

Java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

สำหรับตัวอย่างที่ใช้ ShareActionProvider โปรดดู ActionBarShareActionProviderActivity ใน ApiDemos

มุมมองการดำเนินการแบบยุบได้

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

หากต้องการประกาศว่ารายการการทำงานที่มีมุมมองการดำเนินการยุบได้ ให้ใส่แฟล็ก “collapseActionView" ในแอตทริบิวต์ android:showAsAction สำหรับองค์ประกอบ <item> ในไฟล์ XML ของเมนู

หากต้องการรับ Callback เมื่อมุมมองการดำเนินการสลับระหว่างแบบขยายและยุบ ให้ลงทะเบียน ของ MenuItem.OnActionExpandListener ด้วย MenuItem ที่เกี่ยวข้องด้วยการเรียกใช้ setOnActionExpandListener() โดยปกติแล้ว คุณควรดำเนินการในระหว่างการโทรกลับของ onCreateOptionsMenu()

หากต้องการควบคุมมุมมองการดำเนินการที่ยุบได้ คุณสามารถโทรหา collapseActionView() และ expandActionView() ได้ที่ MenuItem ที่เกี่ยวข้อง

เมื่อสร้างมุมมองการดำเนินการที่กำหนดเอง คุณยังใช้อินเทอร์เฟซใหม่ของ CollapsibleActionView เพื่อรับ Callback เมื่อมีการขยายมุมมองและ ยุบแล้ว

API อื่นๆ สำหรับแถบการทำงาน

  • setHomeButtonEnabled() อนุญาตให้คุณระบุ ไอคอน/โลโก้ทำงานเป็นปุ่มสำหรับนำทางกลับบ้านหรือ "ขึ้น" (ส่งผ่าน “true” เพื่อให้แสดงผลเป็น ปุ่ม)
  • setIcon() และ setLogo() อนุญาตให้คุณกำหนดไอคอนหรือโลโก้ในแถบการทำงานในระหว่างรันไทม์
  • Fragment.setMenuVisibility() ช่วยให้คุณเปิดใช้ หรือปิดการมองเห็นรายการในเมนูตัวเลือกที่ประกาศโดยส่วนย่อย วิธีนี้มีประโยชน์หาก มีการเพิ่มส่วนย่อยไปยังกิจกรรมแล้ว แต่ไม่สามารถมองเห็นได้ ดังนั้นรายการเมนูจึงควร ซ่อนอยู่
  • FragmentManager.invalidateOptionsMenu() ช่วยให้คุณทำให้เมนูตัวเลือกกิจกรรมไม่ถูกต้องในสถานะต่างๆ ของวงจรการใช้งาน Fragment ซึ่งอาจไม่สามารถใช้เมธอดที่เทียบเท่าจาก Activity ได้

อินเทอร์เฟซผู้ใช้และการแสดงผล

Android 4.0 มีมุมมองใหม่ๆ และองค์ประกอบ UI อื่นๆ มากมาย

เลย์เอาต์แบบตารางกริด

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

ดู ApiDemos สำหรับตัวอย่างที่ใช้ GridLayout

มุมมองพื้นผิว

TextureView เป็นมุมมองใหม่ที่อนุญาตให้คุณแสดงสตรีมเนื้อหา เช่น เป็นวิดีโอหรือฉาก OpenGL แม้ว่าจะคล้ายกับ SurfaceView แต่ TextureView จะมีลักษณะการทำงานเหมือนข้อมูลพร็อพเพอร์ตี้ปกติมากกว่าการสร้าง แยกหน้าต่าง เพื่อให้คุณจัดการได้เหมือนกับออบเจ็กต์ View อื่นๆ ตัวอย่างเช่น คุณสามารถใช้การแปลง ทำให้เคลื่อนไหวโดยใช้ ViewPropertyAnimator หรือ ปรับความทึบแสงด้วย setAlpha()

โปรดระวังว่า TextureView ทำงานภายในกรอบเวลาที่มีการเร่งฮาร์ดแวร์เท่านั้น

ดูข้อมูลเพิ่มเติมได้ในเอกสาร TextureView

เปลี่ยนวิดเจ็ต

วิดเจ็ต Switch ใหม่เป็นแบบเปิด/ปิด 2 สถานะที่ผู้ใช้ลากไปที่ใดก็ได้ หรืออีกด้านหนึ่ง (หรือแตะ) เพื่อสลับตัวเลือกระหว่าง 2 สถานะ

คุณใช้แอตทริบิวต์ android:textOn และ android:textOff เพื่อระบุข้อความได้ เพื่อแสดงบนสวิตช์เมื่ออยู่ในการตั้งค่าเปิดและปิด และแอตทริบิวต์ android:text ช่วยให้คุณติดป้ายกำกับข้างสวิตช์ได้

สำหรับตัวอย่างการใช้สวิตช์ โปรดดูไฟล์เลย์เอาต์ switches.xml และสวิตช์ที่เกี่ยวข้อง

Android 3.0 ได้เปิดตัว PopupMenu เพื่อสร้างเมนูบริบทสั้นๆ ที่โดดเด่น ขึ้น ณ จุดยึดที่คุณระบุ (โดยปกติจะอยู่ในจุดของรายการที่เลือก) Android 4.0 เพิ่มเติม PopupMenu ที่มีฟีเจอร์ที่เป็นประโยชน์ 2-3 รายการ ได้แก่

  • ตอนนี้คุณสามารถเพิ่มเนื้อหาของเมนูป๊อปอัปได้อย่างง่ายดายจากทรัพยากรเมนูแบบ XML ด้วย inflate() โดยการส่งรหัสทรัพยากรของเมนู
  • คุณยังสร้าง PopupMenu.OnDismissListener ที่รับ Callback เมื่อมีการปิดเมนู

ค่ากำหนด

Abstract Class ใหม่ที่มีชื่อว่า TwoStatePreference เป็นพื้นฐานสำหรับ การตั้งค่าที่มีตัวเลือกแบบ 2 สถานะ SwitchPreference ใหม่เป็นส่วนขยายของ TwoStatePreference ที่มีวิดเจ็ต Switch ใน มุมมองค่ากำหนดเพื่อให้ผู้ใช้สลับการตั้งค่าเป็นเปิดหรือปิด โดยไม่ต้องเปิดการตั้งค่าเพิ่มเติม หน้าจอหรือกล่องโต้ตอบค่ากำหนด ตัวอย่างเช่น แอปพลิเคชันการตั้งค่าจะใช้ SwitchPreference สำหรับการตั้งค่า Wi-Fi และบลูทูธ

ธีมของระบบ

ธีมเริ่มต้นสำหรับแอปพลิเคชันทั้งหมดที่กำหนดเป้าหมายเป็น Android 4.0 (โดยการตั้งค่า targetSdkVersion หรือ minSdkVersion ถึง “14" ขึ้นไป) เปลี่ยนเป็น "ค่าเริ่มต้นของอุปกรณ์" ธีม: Theme.DeviceDefault นี่อาจเป็น ธีม Holo สีเข้มหรือธีมสีเข้มแบบอื่นๆ ที่กำหนดไว้โดยอุปกรณ์ที่เจาะจง

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

คุณต้องการให้แอปกลมกลืนกับธีมโดยรวมของอุปกรณ์ (เช่น เมื่อมี OEM ต่างๆ ระบุธีมเริ่มต้นที่แตกต่างกันสำหรับระบบ) คุณควรใช้ธีมจากกลุ่ม Theme.DeviceDefault อย่างชัดเจน

ปุ่มเมนูตัวเลือก

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

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

การควบคุมสำหรับการแสดง UI ของระบบ

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

ปัจจุบันคุณซ่อนแถบสถานะในโทรศัพท์โดยใช้ธงชาติ FLAG_FULLSCREEN ได้ ใน Android 4.0 API ที่ควบคุม การเปิดเผยของแถบระบบได้รับการอัปเดตเพื่อแสดงลักษณะการทำงานของทั้งแถบระบบได้ดียิ่งขึ้น และแถบนำทาง

  • แฟล็ก SYSTEM_UI_FLAG_LOW_PROFILE จะแทนที่แฟล็ก STATUS_BAR_HIDDEN เมื่อตั้งค่าสถานะนี้ การตั้งค่าสถานะจะเปิดใช้ "โปรไฟล์ต่ำ" สำหรับแถบระบบหรือ แถบนำทาง นอกจากนี้ ยังซ่อนปุ่มนำทางและองค์ประกอบอื่นๆ ในแถบระบบด้วย กำลังเปิดใช้ วิธีนี้จะมีประโยชน์ในการสร้างเกมที่สมจริงยิ่งขึ้นโดยไม่รบกวนการนำทางของระบบ
  • ธง SYSTEM_UI_FLAG_VISIBLE แทนที่แฟล็ก STATUS_BAR_VISIBLE เพื่อขอให้แสดงแถบระบบหรือแถบนำทาง
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION เป็นแฟล็กใหม่ที่ขอ จะซ่อนแถบนำทางไว้ทั้งหมด โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะกับแถบนำทางเท่านั้น ที่ใช้โดยโทรศัพท์มือถือบางรุ่น (จะไม่ซ่อนแถบระบบบนแท็บเล็ต) การนำทาง จะกลับไปดูทันทีที่ระบบได้รับข้อมูลจากผู้ใช้ ด้วยเหตุนี้ โหมดนี้จึงมีประโยชน์ สำหรับการเล่นวิดีโอเป็นหลัก หรือกรณีอื่นๆ ที่จำเป็นต้องใช้ทั้งหน้าจอ แต่ข้อมูลจากผู้ใช้นั้น ไม่จำเป็น

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

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

โปรดดู OverscanActivity สำหรับการสาธิตตัวเลือก UI ต่างๆ ของระบบ

เฟรมเวิร์กอินพุต

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

เหตุการณ์เมื่อวางเมาส์

คลาส View รองรับ “วางเมาส์” แล้ว เหตุการณ์เพื่อให้เกิดการโต้ตอบที่สมบูรณ์ยิ่งขึ้น ผ่านการใช้อุปกรณ์ตัวชี้ (เช่น เมาส์ หรืออุปกรณ์อื่นๆ ที่ขับเคลื่อนหน้าจอ เคอร์เซอร์)

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

View.OnHoverListener ควรแสดงผลเป็น "จริง" จาก onHover() หากจัดการเหตุการณ์โฮเวอร์ หาก Listener แสดงผลเป็น "เท็จ" จากนั้นระบบจะส่งเหตุการณ์ที่อยู่ไปยังมุมมองระดับบนสุดตามปกติ

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

สำหรับการสาธิตเหตุการณ์โฮเวอร์ใหม่ โปรดดูคลาส Hover ใน ApiDemos

เหตุการณ์เกี่ยวกับสไตลัสและปุ่มเมาส์

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

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

แอปพลิเคชันของคุณสามารถแยกความแตกต่างระหว่างการป้อนข้อมูลด้วยนิ้ว เมาส์ สไตลัส และยางลบ โดยค้นหา "ประเภทเครื่องมือ" เชื่อมโยงกับแต่ละเคอร์เซอร์ใน MotionEvent โดยใช้ getToolType() ประเภทเครื่องมือที่กำหนดไว้ในปัจจุบัน ได้แก่ TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER TOOL_TYPE_MOUSE TOOL_TYPE_STYLUS และ TOOL_TYPE_ERASER การค้นหาประเภทเครื่องมือทำให้แอปพลิเคชันของคุณ สามารถจัดการการป้อนข้อมูลด้วยสไตลัสได้หลายวิธีจากการป้อนข้อมูลด้วยนิ้วหรือเมาส์

แอปพลิเคชันของคุณยังค้นหาได้ด้วยว่าปุ่มเมาส์หรือสไตลัสใดที่กดโดยกดปุ่ม "ปุ่ม สถานะ" ของ MotionEvent โดยใช้ getButtonState() สถานะของปุ่มที่กำหนดไว้ในปัจจุบันมีดังนี้ BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACK และ BUTTON_FORWARD เพื่อความสะดวก ปุ่มเมาส์ย้อนกลับและไปข้างหน้า แมปกับคีย์ KEYCODE_BACK และ KEYCODE_FORWARD โดยอัตโนมัติ แอปพลิเคชันของคุณสามารถจัดการคีย์เหล่านี้เพื่อสนับสนุน ปุ่มเมาส์ที่ใช้การนำทางย้อนกลับและไปข้างหน้า

นอกจากการวัดตำแหน่งและแรงกดของการสัมผัสอย่างแม่นยำแล้ว อินพุตบางอย่างของสไตลัส อุปกรณ์ยังรายงานระยะห่างระหว่างหัวปากกาสไตลัสกับหัวปากกาสไตลัส มุมเอียงของสไตลัส และมุมการวางแนวของสไตลัส แอปพลิเคชันของคุณสามารถค้นหาข้อมูลนี้โดยใช้ getAxisValue() กับรหัสแกน AXIS_DISTANCE, AXIS_TILT และ AXIS_ORIENTATION

สำหรับการสาธิตประเภทเครื่องมือ สถานะของปุ่ม และรหัสแกนใหม่ โปรดดูที่ TouchPaint ใน ApiDemos

คุณสมบัติ

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

ตัวอย่างเช่น หากคุณต้องการกำหนดค่าของช่อง bar ในวัตถุ foo คุณต้อง ที่เคยทำก่อนหน้านี้:

Kotlin

foo.bar = value

Java

foo.bar = value;

หากต้องการเรียกใช้ตัวตั้งค่าสำหรับช่องส่วนตัวที่แฝงอยู่ bar คุณจะต้อง ทำสิ่งนี้

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

อย่างไรก็ตาม หากคุณต้องการส่งต่ออินสแตนซ์ foo และกำหนดโค้ดอื่นๆ ให้ มูลค่า bar จริงๆ แล้วไม่มีวิธีเปลี่ยนแปลงเวอร์ชันก่อน Android 4.0 เลย

เมื่อใช้ชั้นเรียน Property คุณจะสามารถประกาศ Property วัตถุ BAR ในคลาส Foo เพื่อให้คุณสามารถตั้งค่าฟิลด์ในอินสแตนซ์ foo ของ คลาส Foo ดังนี้:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

ตอนนี้ชั้นเรียน View ใช้ประโยชน์จากชั้นเรียน Property เพื่อ ช่วยให้คุณตั้งค่าช่องต่างๆ ได้ เช่น พร็อพเพอร์ตี้การเปลี่ยนรูปแบบที่เพิ่มลงใน Android 3.0 (ROTATION, ROTATION_X, TRANSLATION_X ฯลฯ)

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

การเร่งฮาร์ดแวร์

สำหรับ Android 4.0 เป็นต้นไป การเร่งฮาร์ดแวร์สำหรับหน้าต่างทั้งหมดจะเปิดใช้โดยค่าเริ่มต้นหาก แอปพลิเคชันได้ตั้งค่า targetSdkVersion หรือ minSdkVersion ถึง “14" ขึ้นไป โดยทั่วไปแล้ว การเร่งฮาร์ดแวร์จะทำให้ภาพเคลื่อนไหวลื่นไหลขึ้นและลื่นไหลขึ้น รวมทั้งการเพิ่มประสิทธิภาพโดยรวม และการตอบสนองต่อการมีปฏิสัมพันธ์ของผู้ใช้

หากจำเป็น คุณจะปิดใช้การเร่งฮาร์ดแวร์ด้วยตนเองได้โดยใช้ hardwareAccelerated สำหรับแต่ละองค์ประกอบ <activity> หรือ <application> คุณยังสามารถปิดใช้การเร่งฮาร์ดแวร์สำหรับมุมมองแต่ละรายการได้โดยการโทรหา setLayerType(LAYER_TYPE_SOFTWARE)

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเร่งฮาร์ดแวร์ รวมถึงรายการภาพวาดที่ไม่รองรับ โปรดดูส่วนฮาร์ดแวร์ Acceleration

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

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

ข้อมูลโดยละเอียดของข้อมูลอ้างอิงในพื้นที่ของ JNI ได้อธิบายไว้ใน "ข้อมูลอ้างอิงในท้องถิ่นและทั่วโลก" ในเคล็ดลับของ JNI ใน Android 4.0 ระบบปรับปรุง CheckJNI ให้ตรวจจับข้อผิดพลาดเหล่านี้แล้ว ดูโพสต์ถัดไปได้ที่บล็อกของนักพัฒนาแอป Android เกี่ยวกับข้อผิดพลาดที่พบบ่อยเกี่ยวกับข้อมูลอ้างอิงของ JNI และวิธีแก้ไข

การเปลี่ยนแปลงในการใช้งาน JNI นี้จะส่งผลต่อแอปที่กำหนดเป้าหมายเป็น Android 4.0 เท่านั้น โดยการตั้งค่าอย่างใดอย่างหนึ่งต่อไปนี้ targetSdkVersion หรือ minSdkVersion เป็น “14" ขึ้นไป หากคุณตั้งค่าแอตทริบิวต์เหล่านี้ให้มีค่าต่ำกว่า การอ้างอิงในเครื่องของ JNI จะทำงานเหมือนกับเวอร์ชันก่อนหน้า

WebKit

  • WebKit ได้รับการอัปเดตเป็นเวอร์ชัน 534.30 แล้ว
  • รองรับแบบอักษรอินดิก (เทวนาครี เบงกาลี และทมิฬ รวมถึงการรองรับอักขระที่ซับซ้อน จำเป็นสำหรับการรวมรูปอักขระ) ใน WebView และเบราว์เซอร์ในตัว
  • สนับสนุนแบบอักษรเอธิโอเปีย จอร์เจีย และอาร์เมเนียใน WebView และ เบราว์เซอร์ในตัว
  • การรองรับรุ่น WebDriver ทำให้คุณสามารถทดสอบแอปที่ใช้ WebView ได้ง่ายขึ้น

เบราว์เซอร์ Android

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

สิทธิ์

สิทธิ์ใหม่มีดังต่อไปนี้

  • ADD_VOICEMAIL: อนุญาตให้บริการข้อความเสียงเพิ่มข้อความเสียง ไปยังอุปกรณ์
  • BIND_TEXT_SERVICE: บริการที่ใช้งาน SpellCheckerService ต้องต้องการสิทธิ์นี้ด้วยตนเอง
  • BIND_VPN_SERVICE: บริการที่ใช้งาน VpnService ต้องต้องการสิทธิ์นี้ด้วยตนเอง
  • android.Manifest.permission#READ_PROFILE: ให้สิทธิ์การอ่านแก่ผู้ให้บริการ ContactsContract.Profile
  • android.Manifest.permission#WRITE_PROFILE: ให้สิทธิ์การเขียนแก่ผู้ให้บริการ ContactsContract.Profile

ฟีเจอร์ของอุปกรณ์

ฟีเจอร์ใหม่ของอุปกรณ์มีดังนี้

  • FEATURE_WIFI_DIRECT: ประกาศว่าการสมัคร ใช้ Wi-Fi สำหรับการสื่อสารระหว่างเครื่อง

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

API ก่อนหน้า

นอกเหนือจากทุกอย่างข้างต้นแล้ว Android 4.0 ยังสนับสนุน API ทั้งหมดจากรุ่นก่อนหน้า เนื่องจากแพลตฟอร์ม Android 3.x ใช้ได้เฉพาะกับอุปกรณ์ที่มีหน้าจอขนาดใหญ่ ได้รับการพัฒนาสำหรับโทรศัพท์มือถือเป็นหลัก คุณจึงอาจไม่รู้จัก API ทั้งหมดที่เพิ่มไปยัง Android ในรุ่นล่าสุด

มาดู API ที่โดดเด่นที่สุดบางส่วนที่คุณอาจพลาดไป ซึ่งพร้อมให้ใช้งานแล้ว บนมือถือได้เช่นกัน:

Android 3.0
  • Fragment: องค์ประกอบเฟรมเวิร์กที่ช่วยให้คุณแยก องค์ประกอบของกิจกรรมให้เป็นโมดูลที่ทำงานได้ด้วยตนเองซึ่งกำหนด UI และวงจรของลูกค้าเอง โปรดดู คู่มือนักพัฒนาซอฟต์แวร์ส่วนย่อย
  • ActionBar: การแทนที่แถบชื่อแบบดั้งเดิมที่ด้านบนของ หน้าต่างกิจกรรม โดยมีโลโก้แอปพลิเคชันที่มุมซ้ายและ อินเทอร์เฟซสำหรับรายการเมนู โปรดดู คู่มือนักพัฒนาซอฟต์แวร์แถบการดำเนินการ
  • Loader: คอมโพเนนต์ของเฟรมเวิร์กที่ช่วยให้ทำงานไม่พร้อมกัน การโหลดข้อมูลร่วมกับคอมโพเนนต์ UI เพื่อโหลดข้อมูลแบบไดนามิกโดยไม่บล็อก เทรดหลัก โปรดดู คู่มือนักพัฒนาซอฟต์แวร์เครื่องมือโหลด
  • คลิปบอร์ดของระบบ: แอปพลิเคชันสามารถคัดลอกและวางข้อมูล (นอกเหนือจากข้อความ) ไปและกลับจาก คลิปบอร์ดของทั้งระบบ ข้อมูลที่ถูกตัดอาจเป็นข้อความธรรมดา URI หรือ Intent โปรดดู คู่มือนักพัฒนาซอฟต์แวร์คัดลอกและวาง
  • ลากและวาง: ชุด API ที่ติดตั้งอยู่ในเฟรมเวิร์กมุมมองที่อำนวยความสะดวกในการลากและวาง การดำเนินงาน โปรดดู คู่มือนักพัฒนาซอฟต์แวร์ลากและวาง
  • เฟรมเวิร์กภาพเคลื่อนไหวที่ยืดหยุ่นทั้งหมดช่วยให้คุณสามารถสร้างภาพเคลื่อนไหวคุณสมบัติที่กำหนดเอง (View, Drawable, Fragment, Object หรืออื่นๆ) และกำหนดลักษณะของภาพเคลื่อนไหว เช่น เป็นระยะเวลา การประมาณช่วง การทำซ้ำ และอื่นๆ เฟรมเวิร์กใหม่ทำให้ภาพเคลื่อนไหวใน Android ง่ายกว่าที่เคย โปรดดู นักพัฒนาภาพเคลื่อนไหวของพร็อพเพอร์ตี้
  • กราฟิก RenderScript และเครื่องมือประมวลผล: RenderScript มีฟังก์ชัน 3 มิติประสิทธิภาพสูง การแสดงผลกราฟิกและ Compute API ที่ระดับเนทีฟซึ่งคุณเขียนด้วย C (มาตรฐาน C99) มอบประสิทธิภาพในระดับที่คุณคาดหวังจากสภาพแวดล้อมแบบดั้งเดิมในขณะที่ยังคงพกพาได้ ใน CPU และ GPU ที่หลากหลาย โปรดดู นักพัฒนาซอฟต์แวร์ RenderScript
  • กราฟิก 2 มิติที่มีการเร่งความเร็วด้วยฮาร์ดแวร์: ตอนนี้คุณสามารถเปิดใช้งานโหมดแสดงภาพ OpenGL สำหรับ โดยการตั้งค่า {android:hardwareAccelerated="true"} ใน <application> ขององค์ประกอบไฟล์ Manifest ของคุณ องค์ประกอบ หรือสำหรับ <activity> แต่ละรายการ จากองค์ประกอบเหล่านี้ ผลการค้นหานี้ ด้วยภาพเคลื่อนไหวที่ลื่นไหลขึ้น การเลื่อนลื่นไหลขึ้น รวมถึงประสิทธิภาพโดยรวมที่ดีขึ้นและการตอบสนองต่อผู้ใช้ การโต้ตอบ

    หมายเหตุ: หากคุณตั้งค่า minSdkVersion หรือ targetSdkVersion ของแอปพลิเคชันเป็น "14" ขึ้นไป การเร่งฮาร์ดแวร์จะเปิดใช้โดยค่าเริ่มต้น

  • และอื่นๆ อีกมากมาย โปรดดูแพลตฟอร์ม Android 3.0 สำหรับข้อมูลเพิ่มเติม
Android 3.1
  • USB API: API ใหม่ที่มีประสิทธิภาพสำหรับการผสานรวมอุปกรณ์ต่อพ่วงที่เชื่อมต่อเข้ากับ แอปพลิเคชัน Android API นี้อิงตามสแต็ก USB และบริการที่ ในตัวของแพลตฟอร์ม รวมถึงรองรับการโต้ตอบทั้งของโฮสต์ USB และอุปกรณ์ โปรดดูคู่มือนักพัฒนาซอฟต์แวร์โฮสต์และอุปกรณ์เสริม USB
  • MTP/PTP API: แอปพลิเคชันสามารถโต้ตอบกับกล้องที่เชื่อมต่อและ PTP อื่นๆ ได้โดยตรง อุปกรณ์เพื่อรับการแจ้งเตือนเมื่อมีการแนบและนำอุปกรณ์ออก จัดการไฟล์และพื้นที่เก็บข้อมูลใน อุปกรณ์เหล่านั้น รวมถึงโอนไฟล์และข้อมูลเมตาไปและกลับจากอุปกรณ์เหล่านั้นได้ MTP API นำ PTP มาใช้ (Picture Transfer Protocol) ของข้อกำหนด MTP (Media Transfer Protocol) โปรดดู เอกสารประกอบ android.mtp รายการ
  • RTP API: Android แสดง API ในสแต็ก RTP (Real-time Transport Protocol) ในตัว แอปพลิเคชันที่สามารถใช้จัดการการสตรีมข้อมูลแบบออนดีมานด์หรืออินเทอร์แอกทีฟได้ โดยเฉพาะอย่างยิ่ง แอป ที่ให้บริการ VOIP, ข้อความ Push, การประชุม และสตรีมมิงเสียงจะใช้ API เพื่อเริ่มต้นได้ เซสชันต่างๆ และส่งหรือได้รับสตรีมข้อมูลผ่านเครือข่ายใดก็ได้ที่มีอยู่ ดูเอกสารประกอบเกี่ยวกับ android.net.rtp
  • สนับสนุนจอยสติ๊กและอินพุตการเคลื่อนไหวทั่วไปอื่นๆ
  • โปรดดูแพลตฟอร์ม Android 3.1 สำหรับ API ใหม่อื่นๆ อีกมากมาย
Android 3.2
  • หน้าจอใหม่รองรับ API ที่ช่วยให้ควบคุมการทำงานของแอปพลิเคชันได้มากขึ้น ที่แสดงในหน้าจอขนาดต่างๆ โดย API นี้จะขยายโมเดลการสนับสนุนหน้าจอที่มีอยู่เดิมด้วย ความสามารถในการกำหนดเป้าหมายช่วงขนาดหน้าจอที่เฉพาะเจาะจงอย่างแม่นยำตามมิติข้อมูล โดยวัดเป็น หน่วยพิกเซลที่ไม่ขึ้นกับความหนาแน่น (เช่น กว้าง 600dp หรือ 720dp) แทนที่จะกำหนดเป็นหน่วยพิกเซลทั่วไป ขนาดหน้าจอ (เช่น ใหญ่หรือใหญ่) ตัวอย่างเช่น สิ่งนี้มีความสำคัญในการช่วยคุณ แยกความแตกต่างระหว่างขนาด 5 นิ้ว และอุปกรณ์ขนาด 7 นิ้ว ที่ก่อนหน้านี้มีการฝากข้อมูล "ใหญ่" หน้าจอ ดูบล็อกโพสต์ เครื่องมือใหม่สำหรับการจัดการขนาดหน้าจอ
  • ค่าคงที่ใหม่สำหรับ <uses-feature> เป็น ประกาศข้อกำหนดด้านการวางแนวหน้าจอแนวนอนหรือแนวตั้ง
  • "ขนาดหน้าจอ" ของอุปกรณ์ ตอนนี้การกำหนดค่าจะเปลี่ยนไปในระหว่างการวางแนวหน้าจอ เปลี่ยน หากแอปกำหนดเป้าหมายเป็น API ระดับ 13 ขึ้นไป คุณต้องจัดการ "screenSize" การเปลี่ยนแปลงการกำหนดค่าหากคุณต้องการจัดการการเปลี่ยนแปลงการกำหนดค่าของ "orientation" ด้วย โปรดดู android:configChanges สำหรับข้อมูลเพิ่มเติม
  • โปรดดูแพลตฟอร์ม Android 3.2 หมายเหตุสำหรับ API ใหม่อื่นๆ

ระดับ API

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

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

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