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 เพื่อดาวน์โหลดแพลตฟอร์มลงใน 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 ช่วยให้แอปเรียกการดำเนินการที่ระบุว่าผู้ใช้ต้องการเพิ่มรายชื่อติดต่อไปยังโซเชียลเน็ตเวิร์กได้ แอปที่รับแอปจะใช้แอปดังกล่าวเพื่อเชิญรายชื่อติดต่อที่ระบุไปยังเครือข่ายสังคมนั้น แอปส่วนใหญ่จะเป็นผู้รับการดำเนินการนี้ ตัวอย่างเช่น พารามิเตอร์ แอป People ในตัวเรียกใช้ความตั้งใจในการเชิญเมื่อผู้ใช้เลือก "เพิ่มการเชื่อมต่อ" สำหรับ แอปโซเชียลที่แสดงในรายละเอียดการติดต่อของบุคคลนั้น

หากต้องการให้แอปปรากฏในรายการ "เพิ่มการเชื่อมต่อ" แอปของคุณต้องมีอะแดปเตอร์การซิงค์เพื่อซิงค์ข้อมูลติดต่อจากโซเชียลเน็ตเวิร์ก จากนั้นคุณต้องแจ้งให้ระบบทราบว่าแอปของคุณตอบสนองต่อ Intent INVITE_CONTACT โดยเพิ่มแอตทริบิวต์ inviteContactActivity ลงในไฟล์การกําหนดค่าการซิงค์ของแอป พร้อมชื่อที่สมบูรณ์ของกิจกรรมที่ระบบควรเริ่มต้นเมื่อส่ง Intent คําเชิญ กิจกรรมที่เริ่มต้นจะสามารถเรียก 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: เวลาเริ่มต้นของเหตุการณ์เป็นมิลลิวินาทีนับจากจุดเริ่มต้น
  • CalendarContract.EXTRA_EVENT_END_TIME: เหตุการณ์ เวลาสิ้นสุดเป็นมิลลิวินาทีจาก Epoch
  • Events.EVENT_LOCATION: สถานที่จัดกิจกรรม
  • Events.DESCRIPTION: Event description
  • Intent.EXTRA_EMAIL: ที่อยู่อีเมลของผู้ที่ต้องการส่งถึง เชิญ
  • Events.RRULE: การเกิดซ้ำ กฎสำหรับกิจกรรม
  • Events.ACCESS_LEVEL: กิจกรรมเป็นแบบส่วนบุคคลหรือสาธารณะ
  • Events.AVAILABILITY: ระยะเวลาของกิจกรรมนี้อนุญาตให้กำหนดเวลากิจกรรมอื่นๆ พร้อมกันได้หรือไม่

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

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

เนื่องจากในขณะนี้ 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 และส่งผ่านพื้นผิวอินพุต ความกว้างและความสูง และเอาต์พุต พื้นผิวอินพุตต้องเชื่อมโยงกับพื้นผิว 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 FLAG_KEY_MEDIA_* เช่น 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 ที่แสดงผล คุณสามารถระบุบิตแมปสำหรับอาร์ตเวิร์กสื่อ ข้อมูลตัวเลข เช่น เวลาผ่านไป และข้อมูลข้อความ เช่น ชื่อแทร็ก ดูข้อมูลเกี่ยวกับคีย์ที่ใช้ได้ได้ที่ Flag 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() และตรวจสอบว่าค่าที่แสดงผลมากกว่า 0 นอกจากนี้ อุปกรณ์บางรุ่นอาจไม่รองรับการระบุดวงตาและปาก ซึ่งในกรณีนี้ช่องเหล่านั้นในออบเจ็กต์ 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 อาจมีข้อมูลที่คุณต้องการแชร์ระหว่างอุปกรณ์ เช่น แอปรายชื่อติดต่อจะแชร์รายชื่อติดต่อ, YouTube จะแชร์วิดีโอ และเบราว์เซอร์จะแชร์ URL โดยใช้ Android Beam

หากต้องการส่งข้อมูลระหว่างอุปกรณ์โดยใช้ 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 ทั้งหมดสําหรับการเชื่อมต่อแบบ peer-to-peer ด้วย Wi-Fi ชั้นเรียนหลักที่คุณจะต้องดำเนินการด้วยคือ WifiP2pManager ซึ่งคุณจะได้รับเมื่อโทรติดต่อ getSystemService(WIFI_P2P_SERVICE) WifiP2pManager มี API ที่ช่วยให้คุณทําสิ่งต่อไปนี้ได้

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

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

  • อินเทอร์เฟซ WifiP2pManager.ActionListener ช่วยให้คุณสามารถรับ Callback เมื่อการดำเนินการ เช่น การค้นหาแอปเทียบเท่าหรือการเชื่อมต่อกับบุคคลเหล่านั้นสำเร็จหรือไม่สำเร็จ
  • อินเทอร์เฟซ WifiP2pManager.PeerListListener ช่วยให้คุณได้รับ ข้อมูลเกี่ยวกับแอปเทียบเท่าที่ค้นพบ การเรียกกลับจะให้ WifiP2pDeviceList ซึ่งคุณสามารถใช้เรียกข้อมูลออบเจ็กต์ WifiP2pDevice ของอุปกรณ์แต่ละเครื่องในระยะสัญญาณ และรับข้อมูลต่างๆ เช่น ชื่ออุปกรณ์ ที่อยู่ ประเภทอุปกรณ์ การกําหนดค่า WPS ที่อุปกรณ์รองรับ และอื่นๆ
  • อินเทอร์เฟซ WifiP2pManager.GroupInfoListener ช่วยให้คุณทำสิ่งต่อไปนี้ได้ ได้รับข้อมูลเกี่ยวกับกลุ่ม P2P การเรียกกลับจะแสดงออบเจ็กต์ WifiP2pGroup ซึ่งให้ข้อมูลกลุ่ม เช่น เจ้าของ ชื่อเครือข่าย และพาสคีย์
  • อินเทอร์เฟซ WifiP2pManager.ConnectionInfoListener ช่วยให้คุณรับข้อมูลเกี่ยวกับการเชื่อมต่อปัจจุบันได้ การเรียกกลับจะแสดงออบเจ็กต์ 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 ลักษณะการทำงานใหม่จะต้องมีการเรียกกลับเพิ่มเติม เมธอดที่อนุญาตให้มุมมองและระดับบนสุดของมุมมองเพิ่มข้อมูลตามบริบทลงในเหตุการณ์ได้

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

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

  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 เพื่อให้มั่นใจว่ามีเพียงระบบเท่านั้นที่ลิงก์กับ VpnService ได้ (มีเพียงระบบเท่านั้นที่ได้รับสิทธิ์นี้ แอปขอไม่ได้) หากต้องการใช้บริการ 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() ช่วยให้คุณระบุได้ว่าจะให้ไอคอน/โลโก้ทํางานเป็นปุ่มเพื่อไปยังหน้าแรกหรือ "ขึ้น" (ส่ง "จริง" เพื่อให้ทํางานเป็นปุ่ม)
  • setIcon() และ setLogo() ช่วยให้คุณกำหนดไอคอนหรือโลโก้แถบการทำงานขณะรันไทม์ได้
  • Fragment.setMenuVisibility() ช่วยให้คุณเปิดหรือปิดใช้การแสดงรายการในเมนูตัวเลือกที่ประกาศโดยข้อมูลโค้ดได้ ซึ่งมีประโยชน์ในกรณีที่เพิ่มข้อมูลโค้ดลงในกิจกรรมแล้ว แต่ข้อมูลนั้นไม่แสดง ดังนั้นจึงควรซ่อนรายการเมนู
  • FragmentManager.invalidateOptionsMenu() ช่วยให้คุณทำให้เมนูตัวเลือกกิจกรรมเป็นโมฆะได้ในระหว่างสถานะต่างๆ ของวงจรชีวิตของข้อมูลโค้ด ซึ่งการใช้เมธอดที่เทียบเท่าจาก Activity อาจไม่พร้อมใช้งาน

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

Android 4.0 เปิดตัวมุมมองใหม่และคอมโพเนนต์ UI อื่นๆ ที่หลากหลาย

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

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

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

TextureView

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

โปรดทราบว่า TextureView ใช้งานได้เฉพาะในหน้าต่างที่เร่งด้วยฮาร์ดแวร์เท่านั้น

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ TextureView

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

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

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

ดูตัวอย่างการใช้สวิตช์ได้ที่ไฟล์เลย์เอาต์ switches.xml และกิจกรรม Switches ที่เกี่ยวข้อง

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

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

ค่ากำหนด

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 FLAG_FULLSCREEN ใน Android 4.0 API ที่ควบคุม การเปิดเผยของแถบระบบได้รับการอัปเดตเพื่อแสดงลักษณะการทำงานของทั้งแถบระบบได้ดียิ่งขึ้น และแถบนำทาง

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

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

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

ดูการสาธิตตัวเลือก UI ของระบบต่างๆ ในคลาส OverscanActivity

Input Framework

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

เหตุการณ์การโฮเวอร์

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

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

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

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

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

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

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

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

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

แอปพลิเคชันยังสามารถค้นหาว่ามีการกดปุ่มเมาส์หรือสไตลัสใดโดยการค้นหา "button state" ของ 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;

หากต้องการเรียกเมธอด setter สําหรับฟิลด์ส่วนตัวที่อยู่เบื้องหลัง 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)

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

การเปลี่ยนแปลง 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 (โปรโตคอลการโอนรูปภาพ) ของข้อกำหนด MTP (โปรโตคอลการโอนสื่อ) ดูเอกสารประกอบของ android.mtp
  • RTP API: Android แสดง API ในสแต็ก RTP (Realtime Transport Protocol) ในตัว แอปพลิเคชันที่สามารถใช้จัดการการสตรีมข้อมูลแบบออนดีมานด์หรืออินเทอร์แอกทีฟได้ โดยเฉพาะอย่างยิ่ง แอปที่ให้บริการ VOIP, Push-To-Talk, การประชุม และสตรีมมิงเสียงสามารถใช้ API เพื่อเริ่มต้นเซสชัน รวมถึงส่งหรือรับสตรีมข้อมูลผ่านเครือข่ายใดก็ได้ที่มี ดูเอกสารประกอบเกี่ยวกับ android.net.rtp
  • สนับสนุนจอยสติ๊กและอินพุตการเคลื่อนไหวทั่วไปอื่นๆ
  • ดูหมายเหตุเกี่ยวกับแพลตฟอร์ม Android 3.1 เพื่อดู API ใหม่ๆ อีกมากมาย
Android 3.2
  • หน้าจอใหม่รองรับ API ที่ช่วยให้ควบคุมการทำงานของแอปพลิเคชันได้มากขึ้น ที่แสดงในหน้าจอขนาดต่างๆ API นี้ขยายรูปแบบการรองรับหน้าจอที่มีอยู่ด้วยความสามารถในการกําหนดเป้าหมายช่วงขนาดหน้าจอที่เฉพาะเจาะจงตามมิติข้อมูล ซึ่งวัดเป็นหน่วยพิกเซลอิสระ (เช่น กว้าง 600dp หรือ 720dp) แทนที่จะกําหนดเป้าหมายตามขนาดหน้าจอทั่วไป (เช่น ขนาดใหญ่หรือขนาดใหญ่พิเศษ) ตัวอย่างเช่น ข้อมูลนี้ช่วยคุณแยกความแตกต่างระหว่างอุปกรณ์ขนาด 5 นิ้วกับ 7 นิ้ว ซึ่งตามปกติแล้วระบบจะจัดอุปกรณ์ทั้ง 2 ประเภทนี้ไว้ในหมวดหมู่หน้าจอ "ขนาดใหญ่" ดูบล็อกโพสต์ เครื่องมือใหม่สำหรับการจัดการขนาดหน้าจอ
  • ค่าคงที่ใหม่สำหรับ <uses-feature> เป็น ประกาศข้อกำหนดด้านการวางแนวหน้าจอแนวนอนหรือแนวตั้ง
  • ตอนนี้การกำหนดค่า "ขนาดหน้าจอ" ของอุปกรณ์จะเปลี่ยนไปเมื่อการวางแนวหน้าจอเปลี่ยนแปลง หากแอปกำหนดเป้าหมายเป็น API ระดับ 13 ขึ้นไป คุณต้องจัดการ "screenSize" การเปลี่ยนแปลงการกำหนดค่าหากคุณต้องการจัดการการเปลี่ยนแปลงการกำหนดค่าของ "orientation" ด้วย ดูข้อมูลเพิ่มเติมได้ที่ android:configChanges
  • โปรดดูแพลตฟอร์ม Android 3.2 หมายเหตุสำหรับ API ใหม่อื่นๆ

ระดับ API

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

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

ดูข้อมูลเพิ่มเติมได้ที่API ระดับคืออะไร