API ของ Android 4.1

ระดับ API: 16

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

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

หากต้องการเพิ่มประสิทธิภาพแอปสำหรับอุปกรณ์ที่ใช้ Android 4.1 ให้ดีขึ้น คุณควรตั้งค่า targetSdkVersion เป็น "16" ติดตั้งในอิมเมจระบบ Android 4.1 ทดสอบ แล้วเผยแพร่การอัปเดตที่มีการเปลี่ยนแปลงนี้

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของระดับ API ได้ที่ระดับ API คืออะไร

คอมโพเนนต์ของแอป

บริการแบบแยก

การระบุ android:isolatedProcess="true" ในแท็ก <service> จะทำให้ Service ทำงานภายใต้กระบวนการรหัสผู้ใช้แบบแยกต่างหากที่ไม่มีสิทธิ์ของตนเอง

การจัดการหน่วยความจำ

ค่าคงที่ ComponentCallbacks2 ใหม่ เช่น TRIM_MEMORY_RUNNING_LOW และ TRIM_MEMORY_RUNNING_CRITICAL ให้ข้อมูลเพิ่มเติมเกี่ยวกับสถานะหน่วยความจำแก่กระบวนการที่ทำงานอยู่เบื้องหน้าก่อนที่ระบบจะเรียก onLowMemory()

วิธี getMyMemoryState(ActivityManager.RunningAppProcessInfo) ใหม่ช่วยให้คุณเรียกข้อมูลสถานะหน่วยความจำทั่วไปได้

ผู้ให้บริการเนื้อหา

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

วอลเปเปอร์เคลื่อนไหว

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

หากต้องการเปิดเครื่องมือเลือกวอลเปเปอร์เคลื่อนไหว ให้เรียกใช้ startActivity() ด้วย Intent โดยใช้ ACTION_CHANGE_LIVE_WALLPAPER และค่าเพิ่มเติม ที่ระบุวอลเปเปอร์เคลื่อนไหว ComponentName เป็นสตริงใน EXTRA_LIVE_WALLPAPER_COMPONENT

การไปยังส่วนต่างๆ ของกองแอป

Android 4.1 ช่วยให้คุณนำรูปแบบการออกแบบที่เหมาะสมสำหรับการนำทางขึ้นไปใช้ได้ง่ายขึ้น เพียงเพิ่ม android:parentActivityName ลงในองค์ประกอบ <activity> แต่ละรายการในไฟล์ Manifest ระบบจะใช้ข้อมูลนี้เพื่อเปิดกิจกรรมที่เหมาะสมเมื่อผู้ใช้กดปุ่มขึ้นในแถบการดำเนินการ (ขณะที่ดำเนินการปัจจุบันให้เสร็จสิ้นด้วย) ดังนั้น หากคุณประกาศ android:parentActivityName สําหรับแต่ละกิจกรรม คุณก็ไม่จําเป็นต้องใช้เมธอด onOptionsItemSelected() เพื่อจัดการเหตุการณ์การคลิกบนไอคอนแอปของแถบการดำเนินการ เนื่องจากตอนนี้ระบบจะจัดการเหตุการณ์ดังกล่าวและดําเนินการต่อหรือสร้างกิจกรรมที่เหมาะสม

ซึ่งมีประสิทธิภาพอย่างยิ่งสำหรับสถานการณ์ที่ผู้ใช้เข้าสู่กิจกรรมของแอปผ่าน Intent "เจาะลึก" เช่น จากการแจ้งเตือนหรือ Intent จากแอปอื่น (ตามที่อธิบายไว้ในคู่มือการออกแบบสำหรับการไปยังส่วนต่างๆ ของแอป) เมื่อผู้ใช้เข้าสู่กิจกรรมด้วยวิธีนี้ แอปของคุณอาจไม่มีกองซ้อนของกิจกรรมที่กลับมาทำงานต่อได้เมื่อผู้ใช้ไปยังด้านบน อย่างไรก็ตาม เมื่อคุณระบุแอตทริบิวต์ android:parentActivityName สําหรับกิจกรรม ระบบจะจดจําว่าแอปของคุณมีกองซ้อนที่ซ้อนกันของกิจกรรมหลักอยู่แล้วหรือไม่ และหากไม่มี ก็จะสร้างกองซ้อนที่ซ้อนกันแบบสังเคราะห์ซึ่งมีกิจกรรมหลักทั้งหมด

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

เมื่อระบบสร้างกองซ้อนย้อนกลับสังเคราะห์สําหรับแอป ระบบจะสร้าง Intent พื้นฐานเพื่อสร้างอินสแตนซ์ใหม่ของกิจกรรมหลักแต่ละรายการ ดังนั้นจึงไม่มีสถานะที่บันทึกไว้สําหรับกิจกรรมหลักในลักษณะที่คุณคาดหวังหากผู้ใช้ไปยังแต่ละกิจกรรมตามปกติ หากกิจกรรมหลักแสดง UI ที่ขึ้นอยู่กับบริบทของผู้ใช้ตามปกติ ข้อมูลบริบทนั้นจะหายไปและคุณควรแสดงข้อมูลดังกล่าวเมื่อผู้ใช้ไปยังส่วนต่างๆ ของกอง เช่น หากผู้ใช้ดูอัลบั้มในแอปเพลง การไปยังด้านบนอาจนําผู้ใช้ไปยังกิจกรรมที่แสดงรายการอัลบั้มทั้งหมดในประเภทเพลงที่เลือก ในกรณีนี้ หากต้องสร้างสแต็ก คุณจะต้องแจ้งกิจกรรมระดับบนสุดว่าอัลบั้มปัจจุบันเป็นแนวเพลงใด เพื่อให้ระดับบนสุดสามารถแสดงรายการที่เหมาะสมได้ในกรณีที่ผู้ใช้มาจากกิจกรรมนั้นจริงๆ คุณต้องลบล้างเมธอด onPrepareNavigateUpTaskStack() เพื่อส่งข้อมูลดังกล่าวไปยังกิจกรรมสังเคราะห์ระดับบนสุด ซึ่งจะให้ออบเจ็กต์ TaskStackBuilder ที่ระบบสร้างขึ้นเพื่อสังเคราะห์กิจกรรมหลัก TaskStackBuilder มีออบเจ็กต์ Intent รายการที่ระบบใช้เพื่อสร้างกิจกรรมระดับบนสุดแต่ละรายการ ในการใช้งาน onPrepareNavigateUpTaskStack() คุณสามารถแก้ไข Intent ที่เหมาะสมเพื่อเพิ่มข้อมูลเพิ่มเติมที่กิจกรรมหลักสามารถใช้เพื่อระบุบริบทที่เหมาะสมและแสดง UI ที่เหมาะสม

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

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

onNavigateUp()
ลบล้างค่านี้เพื่อดำเนินการที่กำหนดเองเมื่อผู้ใช้กดปุ่มขึ้น
navigateUpTo(Intent)
เรียกใช้เพื่อสิ้นสุดกิจกรรมปัจจุบันและไปยังกิจกรรมที่ระบุโดย Intent ที่ระบุ หากกิจกรรมอยู่ในกองซ้อนด้านหลัง แต่ไม่ใช่กิจกรรมหลักที่ใกล้ที่สุด กิจกรรมอื่นๆ ทั้งหมดระหว่างกิจกรรมปัจจุบันกับกิจกรรมที่ระบุด้วย Intent ก็จะสิ้นสุดลงด้วยเช่นกัน
getParentActivityIntent()
เรียกใช้เพื่อรับ Intent ที่จะเริ่มต้นรายการหลักเชิงตรรกะสําหรับกิจกรรมปัจจุบัน
shouldUpRecreateTask(Intent)
เรียกใช้เพื่อสอบถามว่าต้องสร้างกองซ้อนย้อนกลับสังเคราะห์เพื่อไปยังด้านบนหรือไม่ แสดงค่า "จริง" หากต้องสร้างกองข้อมูลที่ผ่านการสังเคราะห์ และแสดงค่า "เท็จ" หากมีกองข้อมูลที่สอดคล้องกันอยู่แล้ว
finishAffinity()
เรียกใช้เมธอดนี้เพื่อสิ้นสุดกิจกรรมปัจจุบันและกิจกรรมหลักทั้งหมดที่มีความเกี่ยวข้องของงานเดียวกันซึ่งเชื่อมโยงกับกิจกรรมปัจจุบัน หากคุณลบล้างลักษณะการทำงานเริ่มต้น เช่น onNavigateUp() คุณควรเรียกใช้เมธอดนี้เมื่อสร้างสแต็กแบ็กสังเคราะห์เมื่อการนำทางขึ้น
onCreateNavigateUpTaskStack
ลบล้างค่านี้หากต้องการควบคุมวิธีสร้างกองงานสังเคราะห์อย่างเต็มรูปแบบ หากต้องการเพิ่มข้อมูลอื่นๆ ลงใน Intent สําหรับกองซ้อนที่ซ้อนกันอยู่ คุณควรลบล้าง onPrepareNavigateUpTaskStack()
instead

อย่างไรก็ตาม แอปส่วนใหญ่ไม่จำเป็นต้องใช้ API เหล่านี้หรือติดตั้งใช้งาน onPrepareNavigateUpTaskStack() แต่สามารถทําให้แอปทำงานได้อย่างถูกต้องได้ง่ายๆ เพียงเพิ่ม android:parentActivityName ลงในองค์ประกอบ <activity> แต่ละรายการ

มัลติมีเดีย

ตัวแปลงรหัสสื่อ

คลาส MediaCodec ให้สิทธิ์เข้าถึงตัวแปลงรหัสสื่อระดับต่ำสําหรับการเข้ารหัสและถอดรหัสสื่อ คุณสามารถสร้างอินสแตนซ์ MediaCodec ได้โดยเรียกใช้ createEncoderByType() เพื่อเข้ารหัสสื่อ หรือเรียกใช้ createDecoderByType() เพื่อถอดรหัสสื่อ วิธีการแต่ละวิธีใช้ประเภท MIME สำหรับประเภทสื่อที่ต้องการเข้ารหัสหรือถอดรหัส เช่น "video/3gpp" หรือ "audio/vorbis"

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

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

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

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

คุณสามารถจัดการข้อมูลสื่อที่เข้ารหัสในโค้ดได้โดยเรียกใช้ queueSecureInputBuffer() ร่วมกับ MediaCrypto API แทน queueInputBuffer() ปกติ

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ตัวแปลงรหัสได้ที่เอกสารประกอบของ MediaCodec

บันทึกเสียงตามคำสั่ง

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

แทร็กข้อความระบุเวลา

ตอนนี้ MediaPlayer จัดการทั้งแทร็กข้อความในแบนด์และนอกแบนด์ แทร็กข้อความในย่านความถี่จะเป็นแทร็กข้อความภายในแหล่งที่มาของสื่อ MP4 หรือ 3GPP คุณสามารถเพิ่มแทร็กข้อความนอกแบนด์เป็นแหล่งที่มาของข้อความภายนอกผ่านเมธอด addTimedTextSource() หลังจากเพิ่มแหล่งที่มาของแทร็กข้อความภายนอกทั้งหมดแล้ว ควรเรียกใช้ getTrackInfo() เพื่อรับรายการแทร็กที่มีอยู่ทั้งหมดในแหล่งข้อมูล

หากต้องการตั้งค่าแทร็กเพื่อใช้กับ MediaPlayer คุณต้องเรียกใช้ selectTrack() โดยใช้ตำแหน่งดัชนีของแทร็กที่ต้องการใช้

หากต้องการรับการแจ้งเตือนเมื่อแทร็กข้อความพร้อมเล่น ให้ใช้อินเทอร์เฟซ MediaPlayer.OnTimedTextListener แล้วส่งไปที่ setOnTimedTextListener()

เอฟเฟ็กต์เสียง

ตอนนี้คลาส AudioEffect รองรับประเภทการประมวลผลเสียงก่อนการบันทึกเพิ่มเติมต่อไปนี้

  • การตัดเสียงก้อง (AEC) พร้อม AcousticEchoCanceler นำสัญญาณที่ได้รับจากบุคคลระยะไกลออกจากสัญญาณเสียงที่บันทึกไว้
  • การควบคุมค่าเกนอัตโนมัติ (AGC) ด้วย AutomaticGainControl จะปรับเอาต์พุตของสัญญาณที่บันทึกเป็นมาตรฐานโดยอัตโนมัติ
  • ตัวลดเสียงรบกวน (NS) ที่มี NoiseSuppressor จะนำเสียงรบกวนรอบข้างออกจากสัญญาณที่บันทึก

คุณสามารถใช้เอฟเฟกต์ตัวประมวลผลล่วงหน้าเหล่านี้กับเสียงที่บันทึกด้วย AudioRecord โดยใช้คลาสย่อย AudioEffect คลาสใดคลาสหนึ่งได้

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

เล่นได้ราบรื่น

ตอนนี้คุณสามารถเล่นแบบไม่มีช่วงพักระหว่างออบเจ็กต์ MediaPlayer 2 รายการที่แยกกัน คุณสามารถเรียกใช้ MediaPlayer ได้ทุกเมื่อก่อนที่ MediaPlayer รายการแรกจะเล่นจบ และ Android จะพยายามเริ่มเล่นรายการที่ 2 ทันทีที่รายการแรกหยุดเล่นsetNextMediaPlayer()

เราเตอร์สื่อ API ใหม่อย่าง MediaRouter, MediaRouteActionProvider และ MediaRouteButton มีกลไกและ UI มาตรฐานสำหรับการเลือกตำแหน่งที่จะเล่นสื่อ

กล้อง

การเคลื่อนไหวของโฟกัสอัตโนมัติ

อินเทอร์เฟซใหม่ Camera.AutoFocusMoveCallback ช่วยให้คุณฟังการเปลี่ยนแปลงของการเคลื่อนไหวโฟกัสอัตโนมัติได้ คุณสามารถลงทะเบียนอินเทอร์เฟซกับ setAutoFocusMoveCallback() ได้ จากนั้นเมื่อกล้องอยู่ในโหมดโฟกัสอัตโนมัติแบบต่อเนื่อง (FOCUS_MODE_CONTINUOUS_VIDEO หรือ FOCUS_MODE_CONTINUOUS_PICTURE) คุณจะได้รับสายเรียกเข้าไปที่ onAutoFocusMoving() ซึ่งจะบอกว่าการโฟกัสอัตโนมัติเริ่มเคลื่อนที่หรือหยุดเคลื่อนที่แล้ว

เสียงกล้อง

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

หากต้องการเล่นเสียง ให้สร้างอินสแตนซ์ของออบเจ็กต์ MediaActionSound, เรียกใช้ load() เพื่อโหลดเสียงที่ต้องการไว้ล่วงหน้า จากนั้นเรียกใช้ play() ในเวลาที่เหมาะสม

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

Android Beam

ตอนนี้ Android Beam™ รองรับการโอนข้อมูลขนาดใหญ่ผ่านบลูทูธแล้ว เมื่อคุณกำหนดข้อมูลที่จะโอนด้วยเมธอด setBeamPushUris() ใหม่หรืออินเทอร์เฟซ Callback NfcAdapter.CreateBeamUrisCallback ใหม่ Android จะส่งต่อการโอนข้อมูลไปยังบลูทูธหรือการรับส่งข้อมูลอื่นเพื่อให้โอนข้อมูลได้เร็วขึ้น วิธีนี้มีประโยชน์มากโดยเฉพาะสำหรับเพย์โหลดขนาดใหญ่ เช่น ไฟล์ภาพและไฟล์เสียง และไม่จำเป็นต้องเห็นการจับคู่ระหว่างอุปกรณ์ แอปไม่จำเป็นต้องดำเนินการเพิ่มเติมเพื่อใช้ประโยชน์จากการโอนผ่านบลูทูธ

เมธอด setBeamPushUris() จะรับอาร์เรย์ของออบเจ็กต์ Uri ที่ระบุข้อมูลที่คุณต้องการโอนจากแอป หรือจะใช้อินเทอร์เฟซ NfcAdapter.CreateBeamUrisCallback ก็ได้ ซึ่งคุณระบุสำหรับกิจกรรมได้โดยเรียกใช้ setBeamPushUrisCallback()

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

การค้นหาบริการเครือข่าย

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

แพ็กเกจใหม่ android.net.nsd มี API ใหม่ที่ให้คุณออกอากาศบริการในเครือข่ายภายใน ค้นหาอุปกรณ์ภายในเครือข่าย และเชื่อมต่อกับอุปกรณ์

หากต้องการลงทะเบียนบริการ คุณต้องสร้างออบเจ็กต์ NsdServiceInfo ก่อน แล้วกำหนดพร็อพเพอร์ตี้ต่างๆ ของบริการด้วยเมธอด เช่น setServiceName(), setServiceType() และ setPort()

จากนั้นคุณต้องติดตั้งใช้งาน NsdManager.RegistrationListener และส่งไปยัง registerService() ด้วย NsdServiceInfo

หากต้องการค้นหาบริการในเครือข่าย ให้ใช้ NsdManager.DiscoveryListener และส่งไปยัง discoverServices()

เมื่อ NsdManager.DiscoveryListener ได้รับคอลแบ็กเกี่ยวกับบริการที่พบ คุณต้องแก้ไขบริการโดยการเรียกใช้ resolveService() โดยส่งการใช้งาน NsdManager.ResolveListener ที่ได้รับออบเจ็กต์ NsdServiceInfo ที่มีข้อมูลเกี่ยวกับบริการที่พบ ซึ่งจะช่วยให้คุณเริ่มการเชื่อมต่อได้

การสำรวจบริการ Wi-Fi P2P

API ของ Wi-Fi P2P ได้รับการปรับปรุงใน Android 4.1 เพื่อรองรับการสำรวจบริการก่อนการเชื่อมโยงใน WifiP2pManager ซึ่งจะช่วยให้คุณค้นพบและกรองอุปกรณ์ที่อยู่ใกล้เคียงตามบริการโดยใช้ Wi-Fi P2P ก่อนเชื่อมต่อกับอุปกรณ์หนึ่งๆ ได้ ส่วนการสำรวจบริการเครือข่ายจะช่วยให้คุณค้นพบบริการในเครือข่ายที่เชื่อมต่ออยู่ (เช่น เครือข่าย Wi-Fi ในบ้าน)

หากต้องการออกอากาศแอปเป็นบริการผ่าน Wi-Fi เพื่อให้อุปกรณ์อื่นๆ ค้นพบแอปและเชื่อมต่อกับแอป ให้เรียกใช้ addLocalService() ด้วยออบเจ็กต์ WifiP2pServiceInfo ที่อธิบายบริการแอป

หากต้องการเริ่มค้นหาอุปกรณ์ที่อยู่ใกล้เคียงผ่าน Wi-Fi ก่อนอื่นคุณต้องตัดสินใจว่าจะสื่อสารโดยใช้ Bonjour หรือ Upnp หากต้องการใช้ Bonjour ให้ตั้งค่า Listener ของ Callback บางส่วนด้วย setDnsSdResponseListeners() ซึ่งจะใช้ทั้ง WifiP2pManager.DnsSdServiceResponseListener และ WifiP2pManager.DnsSdTxtRecordListener หากต้องการใช้ Upnp ให้เรียกใช้ setUpnpServiceResponseListener() ซึ่งจะรับ WifiP2pManager.UpnpServiceResponseListener

ก่อนเริ่มค้นหาบริการในอุปกรณ์ในพื้นที่ คุณต้องโทรหา addServiceRequest() ด้วย เมื่อ WifiP2pManager.ActionListener ที่คุณส่งไปยังเมธอดนี้ได้รับการเรียกกลับสําเร็จ คุณสามารถเริ่มค้นหาบริการในอุปกรณ์ภายในได้โดยเรียกใช้ discoverServices()

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

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

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

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

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

การเข้าถึง API บริการการช่วยเหลือพิเศษเพิ่มขึ้นอย่างมากใน Android 4.1 ซึ่งตอนนี้ช่วยให้คุณสร้างบริการที่ตรวจสอบและตอบสนองต่อเหตุการณ์อินพุตเพิ่มเติม เช่น ท่าทางสัมผัสที่ซับซ้อนโดยใช้ onGesture() และเหตุการณ์อินพุตอื่นๆ ผ่านการเพิ่มคลาส AccessibilityEvent, AccessibilityNodeInfo และ AccessibilityRecord

บริการการช่วยเหลือพิเศษยังดำเนินการในนามของผู้ใช้ได้ด้วย เช่น การคลิก การเลื่อน และเลื่อนดูข้อความโดยใช้ performAction และ setMovementGranularities นอกจากนี้ เมธอด performGlobalAction() ยังอนุญาตให้บริการดำเนินการต่างๆ เช่น กลับ หน้าแรก และเปิดแอปและการแจ้งเตือนล่าสุด

การไปยังส่วนต่างๆ ของแอปที่ปรับแต่งได้

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

วิดเจ็ตที่เข้าถึงได้มากขึ้น

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

คัดลอกและวาง

คัดลอกและวางด้วย Intent

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

รองรับรูปแบบ HTML และสตริง

คลาส ClipData รองรับข้อความที่จัดรูปแบบแล้ว (ทั้งสตริงที่มีการจัดรูปแบบของ HTML หรือ Android) คุณสามารถเพิ่มข้อความที่มีการจัดรูปแบบ HTML ไปยัง ClipData ด้วย newHtmlText()

Renderscript

ฟังก์ชันการคำนวณ Renderscript ได้รับการปรับปรุงให้ดีขึ้นด้วยฟีเจอร์ต่อไปนี้

  • รองรับหลายเคอร์เนลภายในสคริปต์เดียว
  • การรองรับการอ่านจากการจัดสรรด้วยตัวอย่างที่กรองแล้วจากการประมวลผลใน Script API ใหม่ rsSample
  • การรองรับความแม่นยำของ FP ในระดับต่างๆ ใน #pragma
  • รองรับการค้นหาข้อมูลเพิ่มเติมจากออบเจ็กต์ RS จากสคริปต์ประมวลผล
  • การปรับปรุงประสิทธิภาพหลายรายการ

นอกจากนี้ยังมีพรอมต์ใหม่สำหรับกำหนดความแม่นยำของทศนิยมที่คอมไพล์ Renderscript ของคุณต้องใช้ ซึ่งจะช่วยให้คุณเปิดใช้การดำเนินการแบบ NEON เช่น การดำเนินการทางคณิตศาสตร์เวกเตอร์ที่รวดเร็วในเส้นทางของ CPU ซึ่งจะใช้งานไม่ได้หากใช้มาตรฐาน IEEE 754-2008 แบบเต็ม

หมายเหตุ: ขณะนี้ระบบเลิกใช้งานเครื่องมือกราฟิก Renderscript รุ่นทดลองแล้ว

แอนิเมชัน

ภาพเคลื่อนไหวการเปิดกิจกรรม

ตอนนี้คุณเปิด Activity โดยใช้ภาพเคลื่อนไหวการซูมหรือภาพเคลื่อนไหวที่กําหนดเองได้แล้ว หากต้องการระบุภาพเคลื่อนไหวที่ต้องการ ให้ใช้ ActivityOptions API เพื่อสร้าง Bundle แล้วส่งไปยังเมธอดใดก็ได้ที่เริ่มกิจกรรม เช่น startActivity()

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

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

ภาพเคลื่อนไหวแสดงเวลา

TimeAnimator ใหม่มีกลไก Callback ง่ายๆ พร้อม TimeAnimator.TimeListener ซึ่งจะแจ้งเตือนให้คุณทราบทุกเฟรมของภาพเคลื่อนไหว ภาพเคลื่อนไหวนี้จะไม่มีการตั้งค่าระยะเวลา การประมาณค่า หรือค่าวัตถุ การเรียกกลับของผู้ฟังจะได้รับข้อมูลสำหรับแต่ละเฟรม รวมถึงเวลาทั้งหมดที่ผ่านไปและเวลาที่ผ่านไปนับตั้งแต่เฟรมของภาพเคลื่อนไหวก่อนหน้า

อินเทอร์เฟซผู้ใช้

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

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

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

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

Notification.BigPictureStyle
สำหรับการแจ้งเตือนที่มีไฟล์แนบรูปภาพขนาดใหญ่
Notification.BigTextStyle
สำหรับการแจ้งเตือนที่มีข้อความจำนวนมาก เช่น อีเมลฉบับเดียว
Notification.InboxStyle
สำหรับการแจ้งเตือนที่มีรายการสตริง เช่น ตัวอย่างข้อมูลจากอีเมลหลายฉบับ
การดำเนินการกับการแจ้งเตือน

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

หากต้องการเพิ่มปุ่มการดําเนินการ ให้เรียกใช้ addAction() เมธอดนี้ใช้อาร์กิวเมนต์ 3 รายการ ได้แก่ ทรัพยากรที่วาดได้สำหรับไอคอน ข้อความสำหรับปุ่ม และ PendingIntent ที่กําหนดการดําเนินการที่จะทํา

ลำดับความสำคัญ

ตอนนี้คุณสามารถบอกระบบว่าความสำคัญของการแจ้งเตือนส่งผลต่อลําดับการแจ้งเตือนในรายการอย่างไรได้ โดยการตั้งค่าลําดับความสําคัญด้วย setPriority() คุณสามารถส่งค่านี้ในระดับความสำคัญ 1 ใน 5 ระดับที่กําหนดโดยPRIORITY_*ค่าคงที่ ในคลาส Notification ค่าเริ่มต้นคือ PRIORITY_DEFAULT ซึ่งอีก 2 ระดับจะสูงกว่าและต่ำกว่าอีก 2 ระดับ

การแจ้งเตือนที่มีลำดับความสำคัญสูงคือสิ่งที่ผู้ใช้มักต้องการตอบกลับอย่างรวดเร็ว เช่น ข้อความ Instant Message ใหม่ ข้อความ หรือช่วยเตือนกิจกรรมที่กําลังจะเกิดขึ้น การแจ้งเตือนที่มีลําดับความสําคัญต่ำ เช่น กิจกรรมในปฏิทินหมดอายุหรือโปรโมชันแอป

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

Android 4.0 (Ice Cream Sandwich) ได้เพิ่มแฟล็กใหม่เพื่อควบคุมการเปิดเผยองค์ประกอบ UI ของระบบ เช่น เพื่อทำให้แถบระบบจางลงหรือทำให้แถบระบบหายไปโดยสิ้นเชิง Android 4.1 เพิ่ม Flag อีก 2-3 รายการที่ช่วยให้คุณควบคุมลักษณะที่ปรากฏขององค์ประกอบ UI ของระบบและเลย์เอาต์ของกิจกรรมที่เกี่ยวข้องกับองค์ประกอบเหล่านั้นได้มากขึ้นโดยการเรียกใช้ setSystemUiVisibility() และส่ง Flag ต่อไปนี้

SYSTEM_UI_FLAG_FULLSCREEN
ซ่อน UI ของระบบที่ไม่สำคัญ (เช่น แถบสถานะ) หากกิจกรรมใช้แถบการดำเนินการในโหมดวางซ้อน (โดยการเปิดใช้ android:windowActionBarOverlay) FLAG นี้จะซ่อนแถบการดำเนินการด้วย และจะซ่อนด้วยภาพเคลื่อนไหวที่ประสานกันเมื่อทั้งซ่อนและแสดงแถบการดำเนินการ
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
ตั้งค่าเลย์เอาต์กิจกรรมให้ใช้พื้นที่หน้าจอเดียวกับที่ใช้ได้เมื่อคุณเปิดใช้ SYSTEM_UI_FLAG_FULLSCREEN แม้ว่าองค์ประกอบ UI ของระบบจะยังมองเห็นอยู่ก็ตาม แม้ว่า UI ของระบบจะซ้อนทับส่วนต่างๆ ของเลย์เอาต์ แต่ตัวเลือกนี้มีประโยชน์หากแอปมักซ่อนและแสดง UI ของระบบด้วย SYSTEM_UI_FLAG_FULLSCREEN เนื่องจากจะทำให้เลย์เอาต์ไม่ปรับให้เข้ากับขอบเขตของเลย์เอาต์ใหม่ทุกครั้งที่ UI ของระบบซ่อนหรือปรากฏขึ้น
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
ตั้งค่าเลย์เอาต์กิจกรรมให้ใช้พื้นที่หน้าจอเดียวกับที่มีเมื่อคุณเปิดใช้ SYSTEM_UI_FLAG_HIDE_NAVIGATION (เพิ่มใน Android 4.0) แม้ว่าองค์ประกอบ UI ของระบบจะยังมองเห็นได้อยู่ แม้ว่าแถบนําทางจะวางซ้อนทับเลย์เอาต์บางส่วน แต่วิธีนี้มีประโยชน์หากแอปของคุณซ่อนและแสดงแถบนําทางด้วย SYSTEM_UI_FLAG_HIDE_NAVIGATION บ่อยครั้ง เนื่องจากจะทําให้เลย์เอาต์ไม่ปรับให้เข้ากับขอบเขตเลย์เอาต์ใหม่ทุกครั้งที่แถบนําทางซ่อนหรือปรากฏ
SYSTEM_UI_FLAG_LAYOUT_STABLE
คุณอาจต้องเพิ่ม Flag นี้หากใช้ SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN และ/หรือ SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION เพื่อให้แน่ใจว่าเมื่อคุณเรียกใช้ fitSystemWindows() ในมุมมอง ขอบเขตที่กําหนดจะยังคงสอดคล้องกับพื้นที่หน้าจอที่มีอยู่ กล่าวคือ เมื่อตั้งค่า Flag นี้ fitSystemWindows() จะทํางานราวกับว่าการแสดงผลองค์ประกอบ UI ของระบบไม่มีการเปลี่ยนแปลงแม้ว่าคุณจะซ่อน UI ของระบบทั้งหมดแล้วก็ตาม

หากต้องการดูการพูดคุยเพิ่มเติมเกี่ยวกับ Flag อื่นๆ ที่เกี่ยวข้องกับ UI ของระบบ โปรดอ่านเกี่ยวกับ Flag ที่เพิ่มใน Android 4.0

มุมมองระยะไกล

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

ชุดแบบอักษร

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

รูปแบบแบบอักษร Roboto ทั้งหมดที่ใช้ได้มีดังนี้

  • ปกติ
  • ตัวเอียง
  • ตัวหนา
  • ตัวหนาเอียง
  • น้อย
  • ตัวเอียงสีอ่อน
  • แบบย่อปกติ
  • ตัวเอียงแบบย่อ
  • ตัวหนาแบบย่อ
  • ตัวหนาเอียงแบบย่อ

คุณสามารถใช้รายการใดรายการหนึ่งข้างต้นกับแอตทริบิวต์ fontFamily ใหม่ร่วมกับแอตทริบิวต์ textStyle

ค่าที่รองรับสำหรับ fontFamily มีดังนี้

  • "sans-serif" สำหรับ Roboto ปกติ
  • "sans-serif-light" สำหรับ Roboto Light
  • "sans-serif-condensed" สำหรับ Roboto Condensed

จากนั้นคุณสามารถใช้ตัวหนาและ/หรือตัวเอียงกับค่า textStyle "bold" และ "italic" คุณใช้ทั้ง 2 รายการได้ดังนี้ android:textStyle="bold|italic"

หรือจะใช้ Typeface.create() ก็ได้ เช่น Typeface.create("sans-serif-light", Typeface.NORMAL)

Input Framework

อุปกรณ์อินพุตหลายเครื่อง

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

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

หากต้องการรับแจ้งเมื่อมีการเชื่อมต่อ เปลี่ยนแปลง หรือยกเลิกการเชื่อมต่ออุปกรณ์อินพุตใหม่ ให้ติดตั้งใช้งานอินเทอร์เฟซ InputManager.InputDeviceListener และลงทะเบียนกับ registerInputDeviceListener()

สั่นเมื่อใช้ตัวควบคุมการป้อนข้อมูล

หากอุปกรณ์อินพุตที่เชื่อมต่อมีความสามารถในการสั่นของตัวเอง ตอนนี้คุณสามารถควบคุมการสั่นของอุปกรณ์เหล่านั้นได้โดยใช้ Vibrator API ที่มีอยู่ เพียงเรียกใช้ getVibrator() ใน InputDevice

สิทธิ์

สิทธิ์ใหม่มีดังนี้

READ_EXTERNAL_STORAGE
ให้สิทธิ์เข้าถึงแบบอ่านที่มีการป้องกันสำหรับพื้นที่เก็บข้อมูลภายนอก ใน Android 4.1 แอปพลิเคชันทั้งหมดจะยังคงมีสิทธิ์อ่านโดยค่าเริ่มต้น เราจะเปลี่ยนแปลงเรื่องนี้ในรุ่นที่จะออกในอนาคตเพื่อกำหนดให้แอปพลิเคชันต้องขอสิทธิ์การอ่านโดยใช้สิทธิ์นี้อย่างชัดเจน หากแอปพลิเคชันขอสิทธิ์การเขียนแล้ว ก็จะได้สิทธิ์การอ่านโดยอัตโนมัติด้วย มีตัวเลือกใหม่สำหรับนักพัฒนาแอปในการเปิดการจำกัดการเข้าถึงระดับอ่านเพื่อให้นักพัฒนาแอปทดสอบแอปพลิเคชันกับลักษณะการทำงานของ Android ในอนาคต
android.Manifest.permission.READ_USER_DICTIONARY
อนุญาตให้แอปพลิเคชันอ่านพจนานุกรมของผู้ใช้ การดำเนินการนี้ควรมีไว้สำหรับ IME หรือเครื่องมือแก้ไขพจนานุกรมเท่านั้น เช่น แอปการตั้งค่า
READ_CALL_LOG
อนุญาตให้แอปพลิเคชันอ่านบันทึกการโทรของระบบที่มีข้อมูลเกี่ยวกับสายเรียกเข้าและโทรออก
WRITE_CALL_LOG
อนุญาตให้แอปพลิเคชันแก้ไขบันทึกการโทรของระบบที่จัดเก็บไว้ในโทรศัพท์
android.Manifest.permission.WRITE_USER_DICTIONARY
อนุญาตให้แอปพลิเคชันเขียนลงในพจนานุกรมคำของผู้ใช้

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

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

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

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