API Android 4.0

Cấp độ API: 14

Android 4.0 (ICE_CREAM_SANDWICH) là một bản phát hành chính trên nền tảng bổ sung nhiều tính năng mới cho người dùng và nhà phát triển ứng dụng. Ngoài tất cả các tính năng và API mới được thảo luận dưới đây, Android 4.0 là một bản phát hành quan trọng cho nền tảng vì phiên bản này mang đến một bộ API phong phú và Giao diện ba chiều từ Android 3.x cho màn hình nhỏ hơn. Là nhà phát triển ứng dụng, giờ đây, bạn có một nền tảng và khung API hợp nhất cho phép bạn phát triển và phát hành ứng dụng bằng một tệp APK duy nhất mang lại trải nghiệm người dùng được tối ưu hoá cho điện thoại di động, máy tính bảng, v.v. khi chạy cùng một phiên bản Android – Android 4.0 (API cấp 14) trở lên.

Đối với các nhà phát triển, nền tảng Android 4.0 có sẵn dưới dạng một thành phần có thể tải xuống cho SDK Android. Nền tảng có thể tải xuống bao gồm thư viện Android và hình ảnh hệ thống, cũng như một bộ giao diện trình mô phỏng và nhiều nội dung khác. Để bắt đầu phát triển hoặc kiểm thử trên Android 4.0, hãy sử dụng Trình quản lý SDK Android để tải nền tảng này xuống SDK của bạn.

Tổng quan về API

Các phần dưới đây cung cấp tổng quan kỹ thuật của các API mới trong Android 4.0.

API xã hội trong Trình cung cấp danh bạ

Các API liên hệ do trình cung cấp ContactsContract xác định đã được mở rộng để hỗ trợ các tính năng mới hướng đến xã hội, chẳng hạn như hồ sơ cá nhân cho chủ sở hữu thiết bị và khả năng cho người dùng mời từng liên hệ tham gia mạng xã hội được cài đặt trên thiết bị.

Hồ sơ người dùng

Android hiện có một hồ sơ cá nhân đại diện cho chủ sở hữu thiết bị, như được xác định trong bảng ContactsContract.Profile. Các ứng dụng xã hội duy trì danh tính người dùng có thể đóng góp vào dữ liệu hồ sơ của người dùng bằng cách tạo một mục ContactsContract.RawContacts mới trong ContactsContract.Profile. Điều này nghĩa là địa chỉ liên hệ thô đại diện cho người dùng thiết bị sẽ không nằm trong bảng địa chỉ liên hệ thô truyền thống được xác định bằng URI ContactsContract.RawContacts; thay vào đó, bạn phải thêm địa chỉ liên hệ thô của hồ sơ vào bảng tại CONTENT_RAW_CONTACTS_URI. Sau đó, địa chỉ liên hệ thô trong bảng này sẽ được tổng hợp vào một hồ sơ duy nhất hiển thị cho người dùng có nhãn "Tôi".

Để thêm một người liên hệ thô mới cho hồ sơ, bạn phải có quyền android.Manifest.permission#WRITE_PROFILE. Tương tự, để đọc từ bảng hồ sơ, bạn phải yêu cầu quyền android.Manifest.permission#READ_PROFILE. Tuy nhiên, hầu hết các ứng dụng không cần phải đọc hồ sơ người dùng, ngay cả khi đóng góp dữ liệu cho hồ sơ. Đọc hồ sơ người dùng là một quyền nhạy cảm và bạn cần lưu ý rằng người dùng sẽ hoài nghi những ứng dụng yêu cầu quyền đó.

Mục đích mời

Thao tác theo ý định INVITE_CONTACT cho phép ứng dụng gọi ra một thao tác cho biết người dùng muốn thêm một mục liên hệ vào một mạng xã hội. Ứng dụng nhận được ứng dụng sẽ dùng nó để mời người liên hệ được chỉ định tham gia mạng xã hội đó. Hầu hết ứng dụng sẽ kết thúc thao tác này. Ví dụ: ứng dụng Liên hệ tích hợp sẵn sẽ gọi ý định mời khi người dùng chọn "Thêm kết nối" cho một ứng dụng xã hội cụ thể được liệt kê trong thông tin liên hệ của người dùng.

Để ứng dụng của bạn hiển thị như trong danh sách "Thêm kết nối", ứng dụng của bạn phải cung cấp bộ điều hợp đồng bộ hoá để đồng bộ hoá thông tin liên hệ từ mạng xã hội của bạn. Sau đó, bạn phải cho hệ thống biết rằng ứng dụng của bạn phản hồi ý định INVITE_CONTACT bằng cách thêm thuộc tính inviteContactActivity vào tệp cấu hình đồng bộ hoá của ứng dụng, với tên đủ điều kiện của hoạt động mà hệ thống sẽ bắt đầu khi gửi ý định mời. Sau đó, hoạt động bắt đầu có thể truy xuất URI cho liên hệ được đề cập từ dữ liệu của ý định và thực hiện công việc cần thiết để mời liên hệ đó vào mạng hoặc thêm người đó vào kết nối của người dùng.

Ảnh có kích thước lớn

Android hiện hỗ trợ ảnh có độ phân giải cao cho người liên hệ. Giờ đây, khi bạn đẩy ảnh vào một bản ghi liên hệ, hệ thống sẽ xử lý ảnh đó thành cả hình thu nhỏ 96x96 (như trước đây) và "ảnh hiển thị" 256x256 được lưu trữ trong kho ảnh dựa trên tệp mới (kích thước chính xác mà hệ thống chọn có thể thay đổi trong tương lai). Bạn có thể thêm ảnh lớn vào một người liên hệ bằng cách đặt một ảnh lớn vào cột PHOTO thông thường của một hàng dữ liệu. Sau đó, hệ thống sẽ xử lý ảnh này thành hình thu nhỏ thích hợp và hiển thị bản ghi ảnh.

Phản hồi về việc sử dụng danh bạ

API ContactsContract.DataUsageFeedback mới cho phép bạn theo dõi tần suất người dùng sử dụng các phương thức liên hệ cụ thể với mọi người, chẳng hạn như tần suất người dùng sử dụng từng số điện thoại hoặc địa chỉ email. Thông tin này giúp cải thiện thứ hạng cho từng phương thức liên hệ được liên kết với từng người và cung cấp các đề xuất tốt hơn để liên hệ với từng người.

Nhà cung cấp lịch

API lịch mới cho phép bạn đọc, thêm, sửa đổi và xóa lịch, sự kiện, người tham dự, lời nhắc và cảnh báo được lưu trữ trong Nhà cung cấp lịch.

Nhiều ứng dụng và tiện ích có thể sử dụng các API này để đọc và sửa đổi các sự kiện lịch. Tuy nhiên, một số trường hợp sử dụng hấp dẫn nhất là bộ điều hợp đồng bộ hoá giúp đồng bộ hoá lịch của người dùng từ các dịch vụ lịch khác với Nhà cung cấp lịch để cung cấp vị trí hợp nhất cho tất cả sự kiện của người dùng. Ví dụ: các sự kiện trên Lịch Google được Bộ điều hợp đồng bộ hoá Lịch Google đồng bộ hoá với Nhà cung cấp lịch, cho phép xem các sự kiện này bằng ứng dụng Lịch tích hợp của Android.

Mô hình dữ liệu cho lịch và thông tin liên quan đến sự kiện trong Trình cung cấp lịch do CalendarContract xác định. Tất cả dữ liệu lịch của người dùng được lưu trữ trong một số bảng do nhiều lớp con của CalendarContract xác định:

  • Bảng CalendarContract.Calendars chứa thông tin dành riêng cho lịch. Mỗi hàng trong bảng này chứa thông tin chi tiết của một lịch, chẳng hạn như tên, màu sắc, thông tin đồng bộ hoá, v.v.
  • Bảng CalendarContract.Events chứa thông tin cụ thể về sự kiện. Mỗi hàng trong bảng này chứa thông tin của một sự kiện, chẳng hạn như tiêu đề sự kiện, vị trí, thời gian bắt đầu, thời gian kết thúc, v.v. Sự kiện này có thể xảy ra một lần hoặc lặp lại nhiều lần. Người tham dự, lời nhắc và thuộc tính mở rộng được lưu trữ trong các bảng riêng biệt và sử dụng _ID của sự kiện để liên kết họ với sự kiện.
  • Bảng CalendarContract.Instances lưu giữ thời gian bắt đầu và kết thúc cho các lần xảy ra một sự kiện. Mỗi hàng trong bảng này đại diện cho một lần xuất hiện. Đối với các sự kiện một lần, hệ thống sẽ liên kết một thực thể với các sự kiện. Đối với các sự kiện định kỳ, nhiều hàng sẽ tự động được tạo để tương ứng với nhiều lần xuất hiện của sự kiện đó.
  • Bảng CalendarContract.Attendees chứa thông tin về người tham dự sự kiện hoặc khách. Mỗi hàng đại diện cho một khách của một sự kiện. Giá trị này cho biết kiểu khách của người đó và phản hồi của họ cho sự kiện.
  • Bảng CalendarContract.Reminders lưu giữ dữ liệu cảnh báo/thông báo. Mỗi hàng đại diện cho một cảnh báo cho một sự kiện. Một sự kiện có thể có nhiều lời nhắc. Số lượng lời nhắc cho mỗi sự kiện được chỉ định trong MAX_REMINDERS, do bộ điều hợp đồng bộ hoá sở hữu lịch đã cho thiết lập. Lời nhắc được chỉ định theo số phút trước khi sự kiện được lên lịch và chỉ định phương thức báo thức, chẳng hạn như sử dụng cảnh báo, email hoặc SMS để nhắc người dùng.
  • Bảng CalendarContract.ExtendedProperties chứa các trường dữ liệu mờ mà bộ điều hợp đồng bộ hoá sử dụng. Trình cung cấp không thực hiện hành động nào với các mục trong bảng này, ngoại trừ việc xoá các mục đó khi sự kiện liên quan của các mục đó bị xoá.

Để truy cập vào dữ liệu lịch của người dùng bằng Nhà cung cấp lịch, ứng dụng của bạn phải yêu cầu quyền READ_CALENDAR (đối với quyền đọc) và WRITE_CALENDAR (đối với quyền ghi).

Mục đích của sự kiện

Nếu bạn chỉ muốn thêm một sự kiện vào lịch của người dùng, thì bạn có thể sử dụng ý định ACTION_INSERT với dữ liệu do Events.CONTENT_URI xác định để bắt đầu một hoạt động tạo sự kiện mới trong ứng dụng Lịch. Việc sử dụng ý định này không yêu cầu quyền nào và bạn có thể chỉ định thông tin chi tiết về sự kiện bằng các thành phần bổ sung sau đây:

Nhà cung cấp thư thoại

Nhà cung cấp thư thoại mới cho phép các ứng dụng thêm thư thoại vào thiết bị để hiển thị tất cả thư thoại của người dùng trong một bản trình bày trực quan. Ví dụ: có thể người dùng có nhiều nguồn thư thoại, chẳng hạn như một nguồn của nhà cung cấp dịch vụ điện thoại và một nguồn từ VoIP hoặc các dịch vụ thoại thay thế khác. Những ứng dụng này có thể dùng API Nhà cung cấp thư thoại để thêm thư thoại vào thiết bị. Sau đó, ứng dụng Điện thoại tích hợp sẽ hiển thị tất cả thư thoại cho người dùng trong một bản trình bày hợp nhất. Mặc dù ứng dụng Điện thoại của hệ thống là ứng dụng duy nhất có thể đọc tất cả thư thoại, nhưng mỗi ứng dụng cung cấp thư thoại có thể đọc những ứng dụng đã thêm vào hệ thống (nhưng không thể đọc thư thoại từ các dịch vụ khác).

Vì API hiện không cho phép ứng dụng bên thứ ba đọc tất cả thư thoại từ hệ thống, nên chỉ các ứng dụng bên thứ ba cần sử dụng API thư thoại là những ứng dụng có thư thoại để gửi tới người dùng.

Lớp VoicemailContract xác định trình cung cấp nội dung cho Dịch vụ thư thoại. Các lớp con VoicemailContract.VoicemailsVoicemailContract.Status cung cấp các bảng mà ứng dụng có thể chèn dữ liệu thư thoại để lưu trữ trên thiết bị. Để xem ví dụ về ứng dụng nhà cung cấp thư thoại, hãy xem Bản minh hoạ về Nhà cung cấp dịch vụ thư thoại.

Nội dung đa phương tiện

Android 4.0 bổ sung một số API mới cho các ứng dụng tương tác với nội dung nghe nhìn, chẳng hạn như ảnh, video và nhạc.

Hiệu ứng đa phương tiện

Khung hiệu ứng nội dung nghe nhìn mới cho phép bạn áp dụng nhiều hiệu ứng hình ảnh cho hình ảnh và video. Ví dụ: hiệu ứng hình ảnh cho phép bạn dễ dàng sửa hiệu ứng mắt đỏ, chuyển đổi hình ảnh sang thang màu xám, điều chỉnh độ sáng, điều chỉnh độ rực màu, xoay hình ảnh, áp dụng hiệu ứng mắt cá và làm nhiều việc khác. Hệ thống thực hiện tất cả quá trình xử lý hiệu ứng trên GPU để đạt được hiệu suất tối đa.

Để đạt được hiệu suất tối đa, các hiệu ứng được áp dụng trực tiếp cho hoạ tiết OpenGL. Vì vậy, ứng dụng của bạn phải có ngữ cảnh OpenGL hợp lệ trước khi có thể sử dụng API hiệu ứng. Hoạ tiết mà bạn áp dụng hiệu ứng có thể là từ bitmap, video hoặc thậm chí là máy ảnh. Tuy nhiên, có một số hạn chế nhất định mà kết cấu phải đáp ứng:

  1. Các ảnh này phải được liên kết với hình ảnh hoạ tiết GL_TEXTURE_2D
  2. Chúng phải chứa ít nhất một cấp mipmap

Đối tượng Effect xác định một hiệu ứng đa phương tiện mà bạn có thể áp dụng cho một khung hình ảnh. Quy trình làm việc cơ bản để tạo Effect là:

  1. Gọi EffectContext.createWithCurrentGlContext() từ ngữ cảnh OpenGL ES 2.0.
  2. Sử dụng EffectContext được trả về để gọi EffectContext.getFactory(). Phương thức này sẽ trả về một thực thể của EffectFactory.
  3. Gọi createEffect(), truyền vào đó tên hiệu ứng từ @link android.media.effect.EffectFactory}, chẳng hạn như EFFECT_FISHEYE hoặc EFFECT_VIGNETTE.

Bạn có thể điều chỉnh các tham số của hiệu ứng bằng cách gọi setParameter(), rồi truyền tên và giá trị tham số. Mỗi loại hiệu ứng chấp nhận các tham số khác nhau, được ghi lại bằng tên hiệu ứng. Ví dụ: EFFECT_FISHEYE có một tham số cho scale của sự biến dạng.

Để áp dụng hiệu ứng cho một kết cấu, hãy gọi apply() trên Effect và truyền vào kết cấu đầu vào, chiều rộng và chiều cao của kết cấu cũng như kết cấu đầu ra. Hoạ tiết đầu vào phải được liên kết với hình ảnh hoạ tiết GL_TEXTURE_2D (thường được thực hiện bằng cách gọi hàm glTexImage2D()). Bạn có thể cung cấp nhiều cấp độ mipmap. Nếu hoạ tiết đầu ra chưa được liên kết với hình ảnh hoạ tiết, hoạ tiết đó sẽ tự động được liên kết bởi hiệu ứng dưới dạng GL_TEXTURE_2D và với một cấp độ mipmap (0), có cùng kích thước với đầu vào.

Chúng tôi đảm bảo hỗ trợ tất cả hiệu ứng nêu trong EffectFactory. Tuy nhiên, một số thiết bị không hỗ trợ một số hiệu ứng bổ sung có sẵn từ thư viện bên ngoài. Vì vậy, trước tiên, bạn phải kiểm tra xem hiệu ứng mong muốn từ thư viện bên ngoài có được hỗ trợ hay không bằng cách gọi isEffectSupported().

Ứng dụng điều khiển từ xa

RemoteControlClient mới cho phép trình phát nội dung đa phương tiện bật bộ điều khiển chế độ phát trên các ứng dụng điều khiển từ xa, chẳng hạn như màn hình khoá của thiết bị. Trình phát nội dung đa phương tiện cũng có thể hiển thị thông tin về nội dung nghe nhìn đang phát để hiển thị trên điều khiển từ xa, chẳng hạn như thông tin bản nhạc và ảnh bìa đĩa nhạc.

Để bật các ứng dụng điều khiển từ xa cho trình phát nội dung đa phương tiện, hãy tạo RemoteControlClient bằng hàm khởi tạo, truyền vào đó một PendingIntent phát đi thông báo ACTION_MEDIA_BUTTON. Ý định cũng phải khai báo thành phần BroadcastReceiver tường minh trong ứng dụng giúp xử lý sự kiện ACTION_MEDIA_BUTTON.

Để khai báo phương thức điều khiển nội dung đa phương tiện đầu vào mà trình phát có thể xử lý, bạn phải gọi setTransportControlFlags() trên RemoteControlClient, truyền một tập hợp các cờ FLAG_KEY_MEDIA_*, chẳng hạn như FLAG_KEY_MEDIA_PREVIOUSFLAG_KEY_MEDIA_NEXT.

Sau đó, bạn phải đăng ký RemoteControlClient bằng cách truyền mã đó vào MediaManager.registerRemoteControlClient(). Sau khi đăng ký, broadcast receiver bạn đã khai báo khi tạo thực thể cho RemoteControlClient sẽ nhận các sự kiện ACTION_MEDIA_BUTTON khi một nút được nhấn trên điều khiển từ xa. Ý định mà bạn nhận được bao gồm KeyEvent cho phím phương tiện đã nhấn. Bạn có thể truy xuất phím này từ ý định bằng getParcelableExtra(Intent.EXTRA_KEY_EVENT).

Để hiện thông tin về nội dung nghe nhìn đang phát trên điều khiển từ xa đang phát, hãy gọi editMetaData() và thêm siêu dữ liệu vào RemoteControlClient.MetadataEditor được trả về. Bạn có thể cung cấp bitmap cho hình minh hoạ nội dung đa phương tiện, thông tin dạng số, chẳng hạn như thời gian đã trôi qua và thông tin văn bản như tên bản nhạc. Để biết thông tin về các khoá có sẵn, hãy xem các cờ METADATA_KEY_* trong MediaMetadataRetriever.

Để triển khai mẫu, hãy xem Random Music Player. Công cụ này cung cấp logic tương thích để bật ứng dụng điều khiển từ xa trên các thiết bị Android 4.0 trong khi tiếp tục hỗ trợ các thiết bị quay lại Android 2.1.

Trình phát nội dung đa phương tiện

  • Việc phát trực tuyến nội dung nghe nhìn trực tuyến từ MediaPlayer hiện yêu cầu quyền INTERNET. Nếu bạn sử dụng MediaPlayer để phát nội dung từ Internet, hãy nhớ thêm quyền INTERNET vào tệp kê khai. Nếu không, tính năng phát nội dung đa phương tiện của bạn sẽ không hoạt động kể từ Android 4.0.
  • setSurface() cho phép bạn xác định Surface để hoạt động như bồn lưu trữ video.
  • setDataSource() cho phép bạn gửi thêm tiêu đề HTTP kèm theo yêu cầu của mình. Điều này có thể hữu ích cho việc phát trực tiếp HTTP(S)
  • Sự kiện phát trực tiếp dựa trên HTTP(S) hiện tuân thủ cookie HTTP trên các yêu cầu

Loại nội dung nghe nhìn

Android 4.0 hỗ trợ thêm các tính năng sau:

  • Giao thức phát trực tiếp HTTP/HTTPS phiên bản 3
  • Mã hoá âm thanh AAC thô ADTS
  • Hình ảnh WEBP
  • Video Matroska

Để biết thêm thông tin, hãy xem phần Các định dạng nội dung nghe nhìn được hỗ trợ.

Camera

Lớp Camera hiện có các API để phát hiện khuôn mặt cũng như kiểm soát khu vực lấy nét và đo sáng.

Phát hiện khuôn mặt

Giờ đây, các ứng dụng máy ảnh có thể nâng cao khả năng của ứng dụng thông qua API phát hiện khuôn mặt của Android. API này không chỉ phát hiện khuôn mặt của chủ thể mà còn phát hiện các đặc điểm cụ thể trên khuôn mặt, chẳng hạn như mắt và miệng.

Để phát hiện khuôn mặt trong ứng dụng máy ảnh, bạn phải đăng ký Camera.FaceDetectionListener bằng cách gọi setFaceDetectionListener(). Sau đó, bạn có thể khởi động mặt máy ảnh và bắt đầu nhận diện khuôn mặt bằng cách gọi startFaceDetection().

Khi phát hiện một hoặc nhiều khuôn mặt trong cảnh máy ảnh, hệ thống sẽ gọi lệnh gọi lại onFaceDetection() trong quá trình triển khai Camera.FaceDetectionListener, bao gồm một mảng các đối tượng Camera.Face.

Một thực thể của lớp Camera.Face sẽ cung cấp nhiều thông tin về khuôn mặt được phát hiện, bao gồm:

  • Rect chỉ định các ranh giới của khuôn mặt, tương ứng với trường nhìn hiện tại của máy ảnh
  • Một số nguyên từ 1 đến 100 cho biết mức độ tin cậy của hệ thống khi đối tượng là khuôn mặt người
  • Mã nhận dạng duy nhất để bạn có thể theo dõi nhiều khuôn mặt
  • Một số đối tượng Point cho biết vị trí của mắt và miệng

Lưu ý: Tính năng phát hiện khuôn mặt có thể không được hỗ trợ trên một số thiết bị. Vì vậy, bạn nên kiểm tra bằng cách gọi getMaxNumDetectedFaces() và đảm bảo giá trị trả về lớn hơn 0. Ngoài ra, một số thiết bị có thể không hỗ trợ tính năng nhận dạng mắt và miệng. Trong trường hợp đó, các trường trong đối tượng Camera.Face sẽ rỗng.

Khu vực lấy nét và đo sáng

Giờ đây, các ứng dụng máy ảnh có thể kiểm soát những khu vực mà máy ảnh dùng để lấy nét, cân bằng sáng và tự động phơi sáng. Cả hai tính năng đều sử dụng lớp Camera.Area mới để chỉ định vùng xem hiện tại của máy ảnh sẽ được lấy nét hoặc đo sáng. Một thực thể của lớp Camera.Area sẽ dùng một số nguyên để xác định giới hạn của khu vực bằng Rect và trọng số của khu vực đó (thể hiện mức độ quan trọng của khu vực đó so với các khu vực khác đang xem xét).

Trước khi đặt một vùng lấy nét hoặc vùng lấy sáng, đầu tiên bạn nên gọi getMaxNumFocusAreas() hoặc getMaxNumMeteringAreas() tương ứng. Nếu các giá trị này trả về 0, tức là thiết bị không hỗ trợ tính năng tương ứng.

Để chỉ định vùng lấy nét hoặc vùng lấy sáng cần sử dụng, chỉ cần gọi setFocusAreas() hoặc setMeteringAreas(). Mỗi đối tượng sẽ lấy một List đối tượng Camera.Area cho biết những khu vực cần xem xét để lấy nét hoặc đo sáng. Ví dụ: bạn có thể triển khai một tính năng cho phép người dùng đặt vùng lấy nét bằng cách nhấn vào một vùng bản xem trước. Sau đó, bạn sẽ dịch thành đối tượng Camera.Area và yêu cầu máy ảnh lấy nét vào vùng đó của cảnh đó. Tiêu điểm hoặc độ phơi sáng trong khu vực đó sẽ liên tục cập nhật khi cảnh trong khu vực đó thay đổi.

Tự động lấy nét liên tục cho ảnh

Giờ đây, bạn có thể bật tính năng tự động lấy nét liên tục (CAF) khi chụp ảnh. Để bật CAF trong ứng dụng máy ảnh, hãy chuyển FOCUS_MODE_CONTINUOUS_PICTURE vào setFocusMode(). Khi bạn đã sẵn sàng chụp ảnh, hãy gọi autoFocus(). Camera.AutoFocusCallback của bạn ngay lập tức nhận được một lệnh gọi lại để cho biết liệu đã đạt được tiêu điểm hay chưa. Để tiếp tục CAF sau khi nhận được lệnh gọi lại, bạn phải gọi cancelAutoFocus().

Lưu ý: Tính năng tự động lấy nét liên tục cũng được hỗ trợ khi quay video bằng cách sử dụng FOCUS_MODE_CONTINUOUS_VIDEO (đã được thêm trong API cấp 9).

Các tính năng khác của camera

  • Giờ đây, khi quay video, bạn có thể gọi takePicture() để lưu ảnh mà không làm gián đoạn phiên video. Trước khi thực hiện việc này, bạn nên gọi isVideoSnapshotSupported() để đảm bảo phần cứng hỗ trợ.
  • Giờ đây, bạn có thể khoá độ phơi sáng tự động và cân bằng trắng bằng setAutoExposureLock()setAutoWhiteBalanceLock() để ngăn các thuộc tính này thay đổi.
  • Giờ đây, bạn có thể gọi setDisplayOrientation() trong khi bản xem trước của máy ảnh đang chạy. Trước đây, bạn chỉ có thể gọi lệnh này trước khi bắt đầu xem trước, nhưng giờ đây, bạn có thể thay đổi hướng bất cứ lúc nào.

Ý định truyền tin của camera

  • Camera.ACTION_NEW_PICTURE: Mã này cho biết người dùng đã chụp một ảnh mới. Ứng dụng Máy ảnh tích hợp sẵn sẽ gọi thông báo truyền tin này sau khi chụp ảnh và các ứng dụng máy ảnh bên thứ ba cũng sẽ truyền phát ý định này sau khi chụp ảnh.
  • Camera.ACTION_NEW_VIDEO: Mã này cho biết người dùng đã quay một video mới. Ứng dụng Máy ảnh tích hợp sẵn sẽ gọi thông báo này sau khi quay video và các ứng dụng máy ảnh của bên thứ ba cũng sẽ truyền phát ý định này sau khi quay video.

Truyền tia Android (NDEF Push bằng NFC)

Android Beam là một tính năng NFC mới cho phép bạn gửi thông báo NDEF từ thiết bị này sang thiết bị khác (quy trình còn được gọi là "NDEF Push"). Quá trình chuyển dữ liệu bắt đầu khi 2 thiết bị chạy Android có hỗ trợ tính năng Truyền tia Android ở gần nhau (khoảng 4 cm), thường là khi 2 thiết bị đó chạm vào lưng. Dữ liệu bên trong thông báo NDEF có thể chứa bất kỳ dữ liệu nào mà bạn muốn chia sẻ giữa các thiết bị. Ví dụ: ứng dụng Mọi người chia sẻ danh bạ, YouTube chia sẻ video và Trình duyệt chia sẻ URL bằng tính năng Truyền tia Android.

Để truyền dữ liệu giữa các thiết bị bằng tính năng Truyền tia Android, bạn cần tạo một NdefMessage chứa thông tin bạn muốn chia sẻ trong khi hoạt động của bạn diễn ra ở nền trước. Sau đó, bạn phải truyền NdefMessage đến hệ thống theo một trong 2 cách:

  • Xác định một NdefMessage duy nhất để đẩy khi đang hoạt động:

    Gọi setNdefPushMessage() bất cứ lúc nào để đặt tin nhắn bạn muốn gửi. Ví dụ: bạn có thể gọi phương thức này và chuyển phương thức này vào NdefMessage trong phương thức onCreate() của hoạt động. Sau đó, bất cứ khi nào Android Beam được kích hoạt trên một thiết bị khác trong khi hoạt động đang diễn ra ở nền trước, hệ thống sẽ gửi NdefMessage đến thiết bị đó.

  • Xác định NdefMessage cần đẩy tại thời điểm tính năng Truyền tia Android bắt đầu:

    Triển khai NfcAdapter.CreateNdefMessageCallback, trong đó việc triển khai phương thức createNdefMessage() sẽ trả về NdefMessage mà bạn muốn gửi. Sau đó, truyền việc triển khai NfcAdapter.CreateNdefMessageCallback cho setNdefPushMessageCallback().

    Trong trường hợp này, khi tính năng Truyền tia Android được kích hoạt bằng một thiết bị khác trong khi hoạt động của bạn đang diễn ra ở nền trước, hệ thống sẽ gọi createNdefMessage() để truy xuất NdefMessage mà bạn muốn gửi. Điều này cho phép bạn xác định NdefMessage để chỉ phân phối sau khi bắt đầu Truyền tia Android, trong trường hợp nội dung thông báo có thể thay đổi trong suốt thời gian diễn ra hoạt động.

Trong trường hợp muốn chạy một số mã cụ thể sau khi hệ thống gửi thành công thông báo NDEF đến thiết bị khác, bạn có thể triển khai NfcAdapter.OnNdefPushCompleteCallback và thiết lập bằng setNdefPushCompleteCallback(). Sau đó, hệ thống sẽ gọi onNdefPushComplete() khi thông báo được gửi đi.

Trên thiết bị nhận, hệ thống sẽ gửi thông báo đẩy NDEF theo cách tương tự như với các thẻ NFC thông thường. Hệ thống sẽ gọi một ý định bằng thao tác ACTION_NDEF_DISCOVERED để bắt đầu một hoạt động, với URL hoặc loại MIME được đặt theo NdefRecord đầu tiên trong NdefMessage. Đối với hoạt động bạn muốn phản hồi, bạn có thể khai báo bộ lọc ý định cho các URL hoặc loại MIME mà ứng dụng của bạn quan tâm. Để biết thêm thông tin về Tag Dispatch, vui lòng xem hướng dẫn cho nhà phát triển NFC.

Nếu muốn NdefMessage mang URI, thì giờ đây, bạn có thể sử dụng phương thức tiện lợi createUri để tạo NdefRecord mới dựa trên chuỗi hoặc đối tượng Uri. Nếu URI là một định dạng đặc biệt mà bạn muốn ứng dụng của mình cũng nhận được trong một sự kiện Truyền tia Android, thì bạn nên tạo một bộ lọc ý định cho hoạt động của mình bằng cách sử dụng cùng lược đồ URI để nhận được thông báo NDEF được gửi đến.

Bạn cũng nên truyền một "bản ghi ứng dụng Android" cùng với NdefMessage để đảm bảo rằng ứng dụng của bạn xử lý thông báo NDEF đến, ngay cả khi các ứng dụng khác lọc cùng một thao tác theo ý định. Bạn có thể tạo một bản ghi ứng dụng Android bằng cách gọi createApplicationRecord(), chuyển bản ghi đó vào tên gói của ứng dụng. Khi thiết bị khác nhận được thông báo NDEF cùng bản ghi ứng dụng và nhiều ứng dụng chứa các hoạt động xử lý ý định đã chỉ định, hệ thống sẽ luôn gửi thông báo đến hoạt động trong ứng dụng của bạn (dựa trên bản ghi ứng dụng trùng khớp). Nếu thiết bị mục tiêu hiện chưa cài đặt ứng dụng của bạn, thì hệ thống sẽ sử dụng bản ghi của ứng dụng Android để chạy Google Play và đưa người dùng đến ứng dụng để cài đặt.

Nếu ứng dụng của bạn không dùng API NFC để thực hiện thông báo đẩy NDEF, thì Android sẽ cung cấp hành vi mặc định: Khi ứng dụng chạy ở nền trước trên một thiết bị và Android Beam được gọi bằng một thiết bị chạy Android khác, thì thiết bị kia sẽ nhận được thông báo NDEF với bản ghi ứng dụng Android giúp nhận dạng ứng dụng của bạn. Nếu thiết bị nhận đã cài đặt ứng dụng, hệ thống sẽ khởi chạy ứng dụng đó; nếu ứng dụng chưa được cài đặt, Google Play sẽ mở và đưa người dùng đến ứng dụng của bạn để cài đặt ứng dụng đó.

Bạn có thể đọc thêm về tính năng Truyền tia Android và các tính năng NFC khác trong hướng dẫn cho nhà phát triển Kiến thức cơ bản về NFC. Để xem một số ví dụ về mã sử dụng tính năng Truyền tia Android, hãy xem Bản minh hoạ dùng tính năng Truyền tia Android.

Wi-Fi P2P

Android hiện hỗ trợ kết nối Wi-Fi ngang hàng (P2P) giữa thiết bị chạy Android và các loại thiết bị khác (tuân thủ chương trình chứng nhận Wi-Fi DirectTM của Wi-Fi Alliance) mà không cần điểm phát sóng hoặc kết nối Internet. Khung Android cung cấp một bộ API Wi-Fi P2P cho phép bạn khám phá và kết nối với các thiết bị khác khi mỗi thiết bị hỗ trợ Wi-Fi P2P, sau đó giao tiếp qua kết nối tốc độ trên các khoảng cách dài hơn nhiều so với kết nối Bluetooth.

Gói mới, android.net.wifi.p2p, chứa tất cả API để thực hiện các kết nối ngang hàng bằng Wi-Fi. Lớp chính mà bạn cần xử lý là WifiP2pManager. Bạn có thể lấy lớp này bằng cách gọi getSystemService(WIFI_P2P_SERVICE). WifiP2pManager bao gồm các API cho phép bạn:

  • Khởi động ứng dụng cho kết nối P2P bằng cách gọi initialize()
  • Khám phá các thiết bị ở gần bằng cách gọi cho discoverPeers()
  • Bắt đầu kết nối P2P bằng cách gọi connect()
  • Và các dữ liệu khác

Một số giao diện và lớp khác cũng cần thiết, chẳng hạn như:

  • Giao diện WifiP2pManager.ActionListener cho phép bạn nhận lệnh gọi lại khi một thao tác như khám phá ứng dụng ngang hàng hoặc kết nối với họ thành công hoặc không thành công.
  • Giao diện WifiP2pManager.PeerListListener cho phép bạn nhận thông tin về các ứng dụng ngang hàng đã được phát hiện. Lệnh gọi lại cung cấp WifiP2pDeviceList, từ đó bạn có thể truy xuất đối tượng WifiP2pDevice cho từng thiết bị trong phạm vi và nhận những thông tin như tên thiết bị, địa chỉ, loại thiết bị, cấu hình WPS mà thiết bị hỗ trợ, v.v.
  • Giao diện WifiP2pManager.GroupInfoListener cho phép bạn nhận thông tin về nhóm P2P. Lệnh gọi lại cung cấp một đối tượng WifiP2pGroup. Đối tượng này cung cấp thông tin về nhóm, chẳng hạn như chủ sở hữu, tên mạng và cụm mật khẩu.
  • Giao diện WifiP2pManager.ConnectionInfoListener cho phép bạn nhận thông tin về kết nối hiện tại. Lệnh gọi lại cung cấp đối tượng WifiP2pInfo, chứa thông tin như một nhóm đã được tạo hay chưa và ai là chủ sở hữu nhóm.

Để sử dụng API Wi-Fi P2P, ứng dụng của bạn phải yêu cầu người dùng cấp những quyền sau:

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET (mặc dù về mặt kỹ thuật, ứng dụng của bạn không kết nối với Internet, nhưng việc giao tiếp với Wi-Fi P2P ngang hàng qua cổng java tiêu chuẩn yêu cầu có quyền truy cập Internet).

Hệ thống Android cũng phát sóng một số hành động khác nhau trong một số sự kiện Wi-Fi P2P nhất định:

Xem tài liệu WifiP2pManager để biết thêm thông tin. Ngoài ra, hãy xem ứng dụng mẫu Bản minh hoạ Wi-Fi P2P.

Thiết bị sức khoẻ Bluetooth

Android hiện hỗ trợ các thiết bị có Hồ sơ sức khoẻ qua Bluetooth, vì vậy, bạn có thể tạo các ứng dụng dùng Bluetooth để giao tiếp với các thiết bị sức khoẻ hỗ trợ Bluetooth, chẳng hạn như máy đo nhịp tim, máy đo máu, nhiệt kế và cân.

Tương tự như các tai nghe thông thường và các thiết bị có cấu hình A2DP, bạn phải gọi getProfileProxy() bằng BluetoothProfile.ServiceListener và loại hồ sơ HEALTH để thiết lập kết nối với đối tượng proxy cho hồ sơ.

Sau khi bạn nhận được proxy Hồ sơ sức khoẻ (đối tượng BluetoothHealth), việc kết nối và giao tiếp với các thiết bị sức khoẻ đã ghép nối bao gồm các lớp Bluetooth mới sau đây:

  • BluetoothHealthCallback: Bạn phải mở rộng lớp này và triển khai các phương thức gọi lại để nhận thông tin cập nhật về những thay đổi đối với trạng thái đăng ký của ứng dụng và trạng thái kênh Bluetooth.
  • BluetoothHealthAppConfiguration: Trong khi gọi lại BluetoothHealthCallback, bạn sẽ nhận được một thực thể của đối tượng này. Bản sao này cung cấp thông tin cấu hình về thiết bị theo dõi tình trạng Bluetooth hiện có. Bạn phải sử dụng thiết bị này để thực hiện nhiều thao tác như bắt đầu và chấm dứt kết nối với các API BluetoothHealth.

Để biết thêm thông tin về cách sử dụng Hồ sơ sức khoẻ Bluetooth, hãy xem tài liệu của BluetoothHealth.

Hỗ trợ tiếp cận

Android 4.0 cải thiện khả năng hỗ trợ tiếp cận cho người dùng khiếm thị nhờ chế độ khám phá bằng cách chạm mới và các API mở rộng, cho phép bạn cung cấp thêm thông tin về nội dung khung hiển thị hoặc phát triển các dịch vụ hỗ trợ tiếp cận nâng cao.

Chế độ Khám phá bằng cách chạm

Giờ đây, người dùng bị mất thị lực có thể khám phá màn hình bằng cách chạm và kéo một ngón tay trên màn hình để nghe nội dung mô tả bằng giọng nói. Vì chế độ khám phá bằng cách chạm hoạt động như con trỏ ảo, nên chế độ này cho phép trình đọc màn hình xác định văn bản mô tả giống như cách mà trình đọc màn hình có thể làm khi người dùng di chuyển bằng d-pad hoặc bi xoay, bằng cách đọc thông tin do android:contentDescriptionsetContentDescription() cung cấp dựa trên một sự kiện "di chuột" mô phỏng. Vì vậy, hãy xem đây là lời nhắc rằng bạn nên cung cấp văn bản mô tả cho các thành phần hiển thị trong ứng dụng của mình, đặc biệt là cho ImageButton, EditText, ImageView và các tiện ích khác có thể không tự nhiên chứa văn bản mô tả.

Hỗ trợ tiếp cận cho các khung hiển thị

Để cải thiện thông tin có sẵn cho các dịch vụ hỗ trợ tiếp cận (chẳng hạn như trình đọc màn hình), bạn có thể triển khai các phương thức gọi lại mới cho các sự kiện hỗ trợ tiếp cận trong các thành phần View tuỳ chỉnh.

Trước tiên, điều quan trọng cần lưu ý là hành vi của phương thức sendAccessibilityEvent() đã thay đổi trong Android 4.0. Giống như phiên bản Android cũ, khi người dùng bật các dịch vụ hỗ trợ tiếp cận trên thiết bị và một sự kiện đầu vào (ví dụ: nhấp chuột hoặc di chuột) xảy ra, thì khung hiển thị tương ứng sẽ được thông báo bằng lệnh gọi đến sendAccessibilityEvent(). Trước đây, việc triển khai sendAccessibilityEvent() sẽ khởi động một AccessibilityEvent và gửi đến AccessibilityManager. Hành vi mới này bao gồm một số phương thức gọi lại bổ sung cho phép khung hiển thị và thành phần mẹ thêm thông tin theo ngữ cảnh khác vào sự kiện:

  1. Khi được gọi, các phương thức sendAccessibilityEvent()sendAccessibilityEventUnchecked() sẽ trì hoãn đến onInitializeAccessibilityEvent().

    Có thể việc triển khai tuỳ chỉnh View sẽ muốn triển khai onInitializeAccessibilityEvent() để đính kèm thông tin hỗ trợ tiếp cận bổ sung vào AccessibilityEvent, nhưng cũng nên gọi phương thức triển khai lớp cha để cung cấp thông tin mặc định như thông tin mô tả nội dung chuẩn, chỉ mục mục, v.v. Tuy nhiên, bạn không nên thêm nội dung văn bản bổ sung vào lệnh gọi lại này—điều này sẽ xảy ra tiếp theo.

  2. Sau khi khởi tạo, nếu sự kiện đó là một trong nhiều loại được điền bằng thông tin văn bản, thì khung hiển thị sẽ nhận được lệnh gọi đến dispatchPopulateAccessibilityEvent(). Lệnh gọi này trì hoãn lệnh gọi lại onPopulateAccessibilityEvent().

    Thường thì quá trình triển khai tuỳ chỉnh của View phải triển khai onPopulateAccessibilityEvent() để thêm nội dung văn bản bổ sung vào AccessibilityEvent nếu văn bản android:contentDescription bị thiếu hoặc không đủ. Để thêm nội dung mô tả bằng văn bản khác vào AccessibilityEvent, hãy gọi getText().add().

  3. Tại thời điểm này, View sẽ truyền sự kiện lên hệ phân cấp khung hiển thị bằng cách gọi requestSendAccessibilityEvent() trên khung hiển thị mẹ. Sau đó, mỗi khung hiển thị mẹ có thể tăng cường thông tin hỗ trợ tiếp cận bằng cách thêm AccessibilityRecord cho đến khi cuối cùng khung hiển thị này tiếp cận được khung hiển thị gốc. Phương thức này sẽ gửi sự kiện đến AccessibilityManager bằng sendAccessibilityEvent().

Ngoài các phương thức mới ở trên, hữu ích khi mở rộng lớp View, bạn cũng có thể chặn các lệnh gọi lại sự kiện này trên bất kỳ View nào bằng cách mở rộng AccessibilityDelegate và đặt đối tượng này trên khung hiển thị bằng setAccessibilityDelegate(). Khi bạn thực hiện việc này, mỗi phương thức hỗ trợ tiếp cận trong khung hiển thị sẽ trì hoãn lệnh gọi đến phương thức tương ứng trong thực thể đại diện. Ví dụ: khi nhận được lệnh gọi đến onPopulateAccessibilityEvent(), khung hiển thị sẽ truyền lệnh gọi đó đến cùng một phương thức trong View.AccessibilityDelegate. Mọi phương thức không được thực thể uỷ quyền xử lý sẽ được đưa trở lại ngay chế độ xem cho hành vi mặc định. Nhờ vậy, bạn chỉ cần ghi đè các phương thức cần thiết cho mọi khung hiển thị cụ thể mà không cần mở rộng lớp View.

Nếu muốn giữ khả năng tương thích với các phiên bản Android trước 4.0, đồng thời hỗ trợ các API hỗ trợ tiếp cận mới, bạn có thể thực hiện với phiên bản mới nhất của thư viện hỗ trợ v4 (trong Compatibility Package, r4) bằng cách sử dụng một tập hợp các lớp tiện ích cung cấp API hỗ trợ tiếp cận mới trong thiết kế tương thích ngược.

Dịch vụ hỗ trợ tiếp cận

Nếu bạn đang phát triển một dịch vụ hỗ trợ tiếp cận, thì thông tin về nhiều sự kiện hỗ trợ tiếp cận đã được mở rộng đáng kể để mang lại cho người dùng ý kiến phản hồi nâng cao hơn về khả năng hỗ trợ tiếp cận. Cụ thể, các sự kiện được tạo dựa trên thành phần khung hiển thị, cung cấp thông tin chính xác hơn về bối cảnh và cho phép các dịch vụ hỗ trợ tiếp cận đi qua hệ phân cấp khung hiển thị để nhận thêm thông tin về khung hiển thị và xử lý các trường hợp đặc biệt.

Nếu đang phát triển một dịch vụ hỗ trợ tiếp cận (chẳng hạn như trình đọc màn hình), thì bạn có thể truy cập thêm thông tin nội dung và chuyển đổi hệ phân cấp khung hiển thị bằng quy trình sau:

  1. Khi nhận được AccessibilityEvent từ một ứng dụng, hãy gọi AccessibilityEvent.getRecord() để truy xuất một AccessibilityRecord cụ thể (có thể có một số bản ghi đính kèm với sự kiện đó).
  2. Từ AccessibilityEvent hoặc một AccessibilityRecord riêng lẻ, bạn có thể gọi getSource() để truy xuất đối tượng AccessibilityNodeInfo.

    AccessibilityNodeInfo đại diện cho một nút duy nhất của nội dung cửa sổ ở định dạng cho phép bạn truy vấn thông tin hỗ trợ tiếp cận về nút đó. Đối tượng AccessibilityNodeInfo được trả về từ AccessibilityEvent mô tả nguồn sự kiện, trong khi nguồn từ AccessibilityRecord mô tả phần trước của nguồn sự kiện.

  3. Với AccessibilityNodeInfo, bạn có thể truy vấn thông tin về khung hiển thị đó, gọi getParent() hoặc getChild() để truyền tải hệ phân cấp khung hiển thị và thậm chí thêm các khung hiển thị con vào nút.

Để ứng dụng tự phát hành lên hệ thống dưới dạng dịch vụ hỗ trợ tiếp cận, ứng dụng của bạn phải khai báo tệp cấu hình XML tương ứng với AccessibilityServiceInfo. Để biết thêm thông tin về cách tạo một dịch vụ hỗ trợ tiếp cận, hãy xem AccessibilityServiceSERVICE_META_DATA để biết thông tin về cấu hình XML.

Các API hỗ trợ tiếp cận khác

Nếu bạn quan tâm đến trạng thái hỗ trợ tiếp cận của thiết bị, AccessibilityManager có một số API mới như:

Dịch vụ kiểm tra chính tả

Khung trình kiểm tra chính tả mới cho phép các ứng dụng tạo trình kiểm tra chính tả theo cách tương tự như khung phương thức nhập (dành cho IME). Để tạo một trình kiểm tra chính tả mới, bạn phải triển khai một dịch vụ mở rộng SpellCheckerService và mở rộng lớp SpellCheckerService.Session để cung cấp đề xuất chính tả dựa trên văn bản do phương thức gọi lại của giao diện cung cấp. Trong phương thức gọi lại SpellCheckerService.Session, bạn phải trả về các đề xuất chính tả dưới dạng đối tượng SuggestionsInfo.

Các ứng dụng có dịch vụ kiểm tra chính tả phải khai báo quyền BIND_TEXT_SERVICE theo yêu cầu của dịch vụ. Dịch vụ cũng phải khai báo bộ lọc ý định với <action android:name="android.service.textservice.SpellCheckerService" /> là thao tác của ý định và phải bao gồm một phần tử <meta-data> khai báo thông tin cấu hình cho trình kiểm tra chính tả.

Hãy xem ứng dụng Dịch vụ kiểm tra chính tả mẫu và ứng dụng Ứng dụng kiểm tra chính tả mẫu để tham khảo mã mẫu.

Công cụ chuyển văn bản sang lời nói

API chuyển văn bản sang lời nói (TTS) của Android đã được mở rộng đáng kể để cho phép các ứng dụng dễ dàng triển khai công cụ TTS tuỳ chỉnh hơn, trong khi những ứng dụng muốn dùng công cụ TTS sẽ có một vài API mới để chọn công cụ.

Sử dụng các công cụ chuyển văn bản sang lời nói

Trong các phiên bản Android trước, bạn có thể sử dụng lớp TextToSpeech để thực hiện các thao tác chuyển văn bản sang lời nói (TTS) bằng công cụ TTS do hệ thống cung cấp hoặc đặt một công cụ tuỳ chỉnh bằng setEngineByPackageName(). Trong Android 4.0, phương thức setEngineByPackageName() không còn được dùng và giờ đây, bạn có thể chỉ định công cụ này để sử dụng với hàm khởi tạo TextToSpeech mới chấp nhận tên gói của công cụ TTS.

Bạn cũng có thể truy vấn các công cụ TTS hiện có bằng getEngines(). Phương thức này trả về một danh sách các đối tượng TextToSpeech.EngineInfo, bao gồm cả siêu dữ liệu như biểu tượng, nhãn và tên gói của công cụ.

Xây dựng các công cụ chuyển văn bản sang lời nói

Trước đây, công cụ tuỳ chỉnh yêu cầu xây dựng công cụ bằng cách sử dụng tệp tiêu đề gốc không được ghi nhận. Trong Android 4.0, có một bộ API khung hoàn chỉnh để xây dựng công cụ TTS.

Quy trình thiết lập cơ bản yêu cầu triển khai TextToSpeechService phản hồi ý định INTENT_ACTION_TTS_SERVICE. Công việc chính của công cụ TTS diễn ra trong lệnh gọi lại onSynthesizeText() trong dịch vụ mở rộng TextToSpeechService. Hệ thống phân phối phương thức này 2 đối tượng:

  • SynthesisRequest: Lớp này chứa nhiều dữ liệu, bao gồm cả văn bản cần tổng hợp, ngôn ngữ, tốc độ nói và cao độ của giọng nói.
  • SynthesisCallback: Đây là giao diện mà công cụ TTS của bạn phân phối dữ liệu lời nói thu được dưới dạng âm thanh truyền trực tuyến. Trước tiên, công cụ phải gọi start() để cho biết rằng công cụ đã sẵn sàng phân phối âm thanh, sau đó gọi audioAvailable(), truyền dữ liệu âm thanh vào vùng đệm byte. Sau khi công cụ của bạn đã chuyển tất cả âm thanh qua vùng đệm, hãy gọi done().

Giờ đây, khung hỗ trợ một API thực sự để tạo công cụ TTS, tính năng hỗ trợ triển khai mã gốc đã bị loại bỏ. Hãy tìm bài đăng trên blog về lớp tương thích mà bạn có thể sử dụng để chuyển đổi các công cụ TTS cũ sang khung mới.

Để xem ví dụ về công cụ TTS sử dụng các API mới, hãy xem ứng dụng mẫu Text To Speech Engine.

Mức sử dụng mạng

Android 4.0 cho phép người dùng xem chính xác lượng dữ liệu mạng mà ứng dụng của họ đang sử dụng. Ứng dụng Cài đặt cung cấp các chế độ kiểm soát cho phép người dùng quản lý các giới hạn đã đặt cho mức sử dụng dữ liệu mạng và thậm chí là tắt chế độ sử dụng dữ liệu nền cho từng ứng dụng. Để tránh việc người dùng vô hiệu hoá quyền truy cập của ứng dụng vào dữ liệu ở chế độ nền, bạn nên phát triển các chiến lược để sử dụng kết nối dữ liệu một cách hiệu quả và điều chỉnh mức sử dụng tuỳ thuộc vào loại kết nối hiện có.

Nếu ứng dụng của bạn thực hiện nhiều giao dịch mạng, bạn nên cung cấp các chế độ cài đặt cho phép người dùng kiểm soát thói quen dữ liệu của ứng dụng, chẳng hạn như tần suất ứng dụng đồng bộ hoá dữ liệu, có nên tải lên/tải xuống chỉ khi dùng Wi-Fi, có sử dụng dữ liệu khi chuyển vùng hay không, v.v. Với các chế độ kiểm soát này, người dùng ít có khả năng vô hiệu hoá quyền truy cập của ứng dụng vào dữ liệu khi đạt đến giới hạn, vì ứng dụng có thể sử dụng chính xác lượng dữ liệu. Nếu cung cấp một hoạt động ưu tiên với các chế độ cài đặt này, bạn nên đưa vào phần khai báo tệp kê khai một bộ lọc ý định cho hành động ACTION_MANAGE_NETWORK_USAGE. Ví dụ:

<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>

Bộ lọc ý định này cho hệ thống biết rằng đây là hoạt động kiểm soát mức sử dụng dữ liệu của ứng dụng. Do đó, khi người dùng kiểm tra lượng dữ liệu mà ứng dụng của bạn đang sử dụng qua ứng dụng Cài đặt, nút "Xem các chế độ cài đặt ứng dụng" sẽ có sẵn để khởi chạy hoạt động lựa chọn ưu tiên để người dùng có thể tinh chỉnh lượng dữ liệu mà ứng dụng dùng.

Ngoài ra, hãy lưu ý rằng getBackgroundDataSetting() hiện không còn được dùng và luôn trả về giá trị true. Thay vào đó, hãy sử dụng getActiveNetworkInfo(). Trước khi thực hiện bất kỳ giao dịch mạng nào, bạn phải luôn gọi getActiveNetworkInfo() để lấy NetworkInfo đại diện cho mạng hiện tại và truy vấn isConnected() để kiểm tra xem thiết bị có kết nối hay không. Sau đó, bạn có thể kiểm tra các thuộc tính kết nối khác, chẳng hạn như thiết bị có đang chuyển vùng hoặc đang kết nối với Wi-Fi hay không.

Doanh nghiệp

Android 4.0 mở rộng khả năng dành cho ứng dụng doanh nghiệp với các tính năng sau.

Dịch vụ VPN

VpnService mới cho phép các ứng dụng xây dựng VPN (Mạng riêng ảo) riêng, chạy dưới dạng Service. Dịch vụ VPN tạo giao diện cho một mạng ảo bằng các quy tắc định tuyến và địa chỉ riêng, đồng thời thực hiện tất cả thao tác đọc và ghi bằng chỉ số mô tả tệp.

Để tạo dịch vụ VPN, hãy sử dụng VpnService.Builder. Công cụ này cho phép bạn chỉ định địa chỉ mạng, máy chủ DNS, tuyến mạng và các thông tin khác. Sau khi hoàn tất, bạn có thể thiết lập giao diện bằng cách gọi establish() để trả về một ParcelFileDescriptor.

Vì dịch vụ VPN có thể chặn các gói nên sẽ có những hệ quả về bảo mật. Do đó, nếu triển khai VpnService, thì dịch vụ của bạn phải yêu cầu BIND_VPN_SERVICE để đảm bảo rằng chỉ hệ thống mới có thể liên kết với quyền đó (chỉ hệ thống mới được cấp quyền này mà ứng dụng không thể yêu cầu quyền đó). Để sử dụng dịch vụ VPN, người dùng phải bật dịch vụ này theo cách thủ công trong phần cài đặt hệ thống.

Chính sách thiết bị

Giờ đây, những ứng dụng quản lý các quy định hạn chế về thiết bị có thể tắt máy ảnh bằng cách sử dụng setCameraDisabled() và thuộc tính USES_POLICY_DISABLE_CAMERA (áp dụng bằng phần tử <disable-camera /> trong tệp cấu hình chính sách).

Quản lý chứng chỉ

Lớp KeyChain mới cung cấp các API cho phép bạn nhập và truy cập vào chứng chỉ trong kho khoá hệ thống. Chứng chỉ đơn giản hoá việc cài đặt cả chứng chỉ ứng dụng (để xác thực danh tính của người dùng) và chứng chỉ của tổ chức phát hành chứng chỉ (để xác minh danh tính máy chủ). Các ứng dụng như trình duyệt web hoặc chương trình email khách có thể truy cập vào chứng chỉ đã cài đặt để xác thực người dùng với máy chủ. Hãy xem tài liệu về KeyChain để biết thêm thông tin.

Cảm biến thiết bị

Hai loại cảm biến mới đã được thêm vào Android 4.0:

  • TYPE_AMBIENT_TEMPERATURE: Một cảm biến nhiệt độ cung cấp nhiệt độ của môi trường xung quanh (trong phòng) theo độ C.
  • TYPE_RELATIVE_HUMIDITY: Một cảm biến độ ẩm cung cấp độ ẩm tương đối của môi trường xung quanh (trong phòng) dưới dạng phần trăm.

Nếu một thiết bị có cả cảm biến TYPE_AMBIENT_TEMPERATURETYPE_RELATIVE_HUMIDITY, bạn có thể sử dụng các cảm biến đó để tính điểm sương và độ ẩm tuyệt đối.

Cảm biến nhiệt độ trước đây, TYPE_TEMPERATURE, đã không được dùng nữa. Thay vào đó, bạn nên sử dụng cảm biến TYPE_AMBIENT_TEMPERATURE.

Ngoài ra, 3 cảm biến tổng hợp của Android đã được cải thiện đáng kể nên giờ đây có độ trễ thấp hơn và đầu ra mượt mà hơn. Những cảm biến này bao gồm cảm biến trọng lực (TYPE_GRAVITY), cảm biến vectơ xoay (TYPE_ROTATION_VECTOR) và cảm biến gia tốc tuyến tính (TYPE_LINEAR_ACCELERATION). Các cảm biến được cải tiến dựa vào cảm biến con quay hồi chuyển để cải thiện đầu ra, vì vậy, các cảm biến này chỉ xuất hiện trên các thiết bị có con quay hồi chuyển.

Thanh thao tác

ActionBar đã được cập nhật để hỗ trợ một số hành vi mới. Quan trọng nhất là hệ thống dễ dàng quản lý kích thước và cấu hình của thanh thao tác khi chạy trên các màn hình nhỏ hơn nhằm mang lại trải nghiệm tối ưu cho người dùng trên mọi kích thước màn hình. Ví dụ: khi màn hình hẹp (chẳng hạn như khi điện thoại di động ở hướng dọc), thẻ điều hướng của thanh hành động sẽ xuất hiện trong "thanh xếp chồng" xuất hiện ngay bên dưới thanh thao tác chính. Bạn cũng có thể chọn sử dụng "thanh thao tác phân tách" để đặt tất cả mục hành động vào một thanh riêng ở cuối màn hình khi màn hình bị thu hẹp.

Thanh thao tác tách

Nếu thanh thao tác bao gồm nhiều mục hành động, thì không phải tất cả các mục đó đều vừa với thanh thao tác trên một màn hình hẹp. Do đó, hệ thống sẽ đặt thêm mục vào trình đơn mục bổ sung. Tuy nhiên, Android 4.0 cho phép bạn bật tính năng "chia thanh thao tác" để nhiều mục hành động hơn có thể xuất hiện trên màn hình trong một thanh riêng biệt ở cuối màn hình. Để bật thanh thao tác phân tách, hãy thêm android:uiOptions"splitActionBarWhenNarrow" vào thẻ <application> hoặc các thẻ <activity> riêng lẻ trong tệp kê khai. Khi được bật, hệ thống sẽ thêm một thanh bổ sung ở cuối màn hình cho tất cả các mục hành động khi màn hình bị thu hẹp (sẽ không có mục hành động nào xuất hiện trong thanh hành động chính).

Nếu bạn muốn sử dụng thẻ điều hướng do API ActionBar.Tab cung cấp nhưng không cần thanh thao tác chính ở trên cùng (bạn chỉ muốn các thẻ xuất hiện ở trên cùng), hãy bật thanh thao tác phân tách như mô tả ở trên và cũng gọi setDisplayShowHomeEnabled(false) để tắt biểu tượng ứng dụng trong thanh thao tác. Không còn gì trong thanh thao tác chính, nó sẽ biến mất—tất cả những gì còn lại là các thẻ điều hướng ở trên cùng và các mục hành động ở cuối màn hình.

Kiểu thanh thao tác

Nếu muốn áp dụng kiểu tuỳ chỉnh cho thanh thao tác, bạn có thể sử dụng các thuộc tính kiểu mới backgroundStackedbackgroundSplit để áp dụng màu nền có thể vẽ hoặc màu cho thanh xếp chồng và thanh phân tách tương ứng. Bạn cũng có thể thiết lập các kiểu này trong thời gian chạy bằng setStackedBackgroundDrawable()setSplitBackgroundDrawable().

Trình cung cấp hành động

Lớp ActionProvider mới cho phép bạn tạo một trình xử lý chuyên biệt cho các mục hành động. Trình cung cấp hành động có thể xác định khung hiển thị hành động, hành vi hành động mặc định và trình đơn phụ cho mỗi mục hành động liên kết. Khi bạn muốn tạo một mục hành động có các hành vi động (chẳng hạn như chế độ xem hành động có thể biến, hành động mặc định hoặc trình đơn phụ), việc mở rộng ActionProvider là một giải pháp hiệu quả để tạo thành phần có thể sử dụng lại, thay vì xử lý các phép biến đổi khác nhau của mục hành động trong mảnh hoặc hoạt động của bạn.

Ví dụ: ShareActionProvider là một phần mở rộng của ActionProvider để hỗ trợ thao tác "chia sẻ" trên thanh thao tác. Thay vì sử dụng mục hành động truyền thống gọi ý định ACTION_SEND, bạn có thể sử dụng trình cung cấp hành động này để hiển thị khung hiển thị hành động với danh sách thả xuống gồm các ứng dụng xử lý ý định ACTION_SEND. Khi người dùng chọn một ứng dụng để sử dụng cho thao tác đó, ShareActionProvider sẽ ghi nhớ lựa chọn đó và cung cấp lựa chọn đó trong khung hiển thị hành động để truy cập nhanh hơn vào việc chia sẻ với ứng dụng đó.

Để khai báo trình cung cấp hành động cho một mục hành động, hãy đưa thuộc tính android:actionProviderClass vào phần tử <item> cho trình đơn tuỳ chọn của hoạt động, với giá trị tên lớp của trình cung cấp hành động. Ví dụ:

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

Trong phương thức gọi lại onCreateOptionsMenu() của hoạt động, hãy truy xuất một thực thể của trình cung cấp hành động từ mục trong trình đơn và đặt ý định:

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);
}

Để xem ví dụ về cách sử dụng ShareActionProvider, hãy xem ActionBarShareActionProviderActivity trong Apidemos.

Khung hiển thị hành động có thể thu gọn

Giờ đây, các mục hành động cung cấp khung hiển thị hành động có thể chuyển đổi giữa trạng thái khung hiển thị hành động và trạng thái mục hành động truyền thống. Trước đây, chỉ có SearchView hỗ trợ tính năng thu gọn khi được dùng làm khung hiển thị hành động, nhưng giờ đây, bạn có thể thêm khung hiển thị hành động cho bất kỳ mục hành động nào và chuyển đổi giữa trạng thái mở rộng (chế độ xem hành động đang hiển thị) và trạng thái thu gọn (mục hành động hiển thị).

Để khai báo rằng một mục hành động chứa khung hiển thị hành động có thể thu gọn, hãy thêm cờ “collapseActionView" vào thuộc tính android:showAsAction cho phần tử <item> trong tệp XML của trình đơn.

Để nhận lệnh gọi lại khi khung hiển thị hành động chuyển đổi giữa chế độ mở rộng và thu gọn, hãy đăng ký một bản sao của MenuItem.OnActionExpandListener với MenuItem tương ứng bằng cách gọi setOnActionExpandListener(). Thông thường, bạn nên làm như vậy trong lệnh gọi lại onCreateOptionsMenu().

Để điều khiển khung hiển thị hành động có thể thu gọn, bạn có thể gọi collapseActionView()expandActionView() trên MenuItem tương ứng.

Khi tạo khung hiển thị hành động tuỳ chỉnh, bạn cũng có thể triển khai giao diện CollapsibleActionView mới để nhận lệnh gọi lại khi khung hiển thị được mở rộng và thu gọn.

Các API khác cho thanh thao tác

  • setHomeButtonEnabled() cho phép bạn chỉ định xem biểu tượng/biểu trưng có hoạt động như một nút để điều hướng về màn hình chính hay "lên" (truyền giá trị "true" để làm cho biểu tượng hoạt động như một nút).
  • setIcon()setLogo() cho phép bạn xác định biểu tượng hoặc biểu tượng của thanh thao tác trong thời gian chạy.
  • Fragment.setMenuVisibility() cho phép bạn bật hoặc tắt chế độ hiển thị các mục trong trình đơn tuỳ chọn mà mảnh khai báo. Việc này sẽ hữu ích nếu mảnh được thêm vào hoạt động nhưng không hiển thị, vì vậy, bạn nên ẩn các mục trong trình đơn.
  • FragmentManager.invalidateOptionsMenu() cho phép bạn vô hiệu hoá trình đơn tuỳ chọn hoạt động trong các trạng thái khác nhau của vòng đời mảnh mà trong đó bạn không thể sử dụng phương thức tương đương từ Activity.

Giao diện người dùng và lượt xem

Android 4.0 ra mắt nhiều khung hiển thị mới và các thành phần giao diện người dùng khác.

GridLayout

GridLayout là một nhóm thành phần hiển thị mới giúp đặt các thành phần hiển thị con trong một lưới hình chữ nhật. Không giống như TableLayout, GridLayout dựa vào hệ phân cấp phẳng và không tận dụng thành phần hiển thị trung gian, chẳng hạn như các hàng trong bảng để cung cấp cấu trúc. Thay vào đó, các phần tử con sẽ chỉ định (các) hàng và cột cần chiếm (các) ô có thể kéo dài nhiều hàng và/hoặc cột và theo mặc định được sắp xếp tuần tự trên các hàng và cột của lưới. Hướng GridLayout xác định xem các phần tử con tuần tự được bố trí theo chiều ngang hay chiều dọc theo mặc định. Bạn có thể chỉ định khoảng cách giữa các thành phần con bằng cách sử dụng các thực thể của thành phần hiển thị Space mới hoặc bằng cách đặt tham số lề có liên quan trên các thành phần con.

Hãy xem Apidemos để biết các mẫu sử dụng GridLayout.

Chế độ xem kết cấu

TextureView là một khung hiển thị mới cho phép bạn hiển thị luồng nội dung, chẳng hạn như video hoặc cảnh OpenGL. Mặc dù tương tự như SurfaceView, nhưng TextureView khác biệt ở chỗ nó hoạt động như một khung hiển thị thông thường, thay vì tạo một cửa sổ riêng để bạn có thể coi khung hiển thị này như bất kỳ đối tượng View nào khác. Ví dụ: bạn có thể áp dụng các phép biến đổi, tạo ảnh động cho ảnh bằng ViewPropertyAnimator hoặc điều chỉnh độ mờ bằng setAlpha().

Hãy lưu ý rằng TextureView chỉ hoạt động trong một cửa sổ được tăng tốc phần cứng.

Để biết thêm thông tin, hãy xem tài liệu TextureView.

Chuyển đổi tiện ích

Tiện ích Switch mới là nút bật/tắt hai trạng thái mà người dùng có thể kéo sang một bên hoặc bên kia (hoặc chỉ cần nhấn) để chuyển đổi giữa hai trạng thái.

Bạn có thể sử dụng các thuộc tính android:textOnandroid:textOff để chỉ định văn bản sẽ xuất hiện trên nút chuyển khi ở chế độ cài đặt bật và tắt. Thuộc tính android:text cũng cho phép bạn đặt nhãn cùng với nút chuyển.

Để xem ví dụ về cách sử dụng nút chuyển, hãy xem tệp bố cục switches.xml và hoạt động Switches tương ứng.

Android 3.0 ra mắt PopupMenu để tạo trình đơn theo bối cảnh ngắn bật lên tại điểm neo mà bạn chỉ định (thường là tại điểm của mục đã chọn). Android 4.0 mở rộng PopupMenu với một số tính năng hữu ích:

  • Giờ đây, bạn có thể dễ dàng tăng cường nội dung của trình đơn bật lên từ tài nguyên trình đơn XML bằng inflate(), truyền vào mã nhận dạng tài nguyên trình đơn.
  • Giờ đây, bạn cũng có thể tạo một PopupMenu.OnDismissListener nhận lệnh gọi lại khi trình đơn đóng.

Tuỳ chọn

Một lớp trừu tượng TwoStatePreference mới làm cơ sở cho các lựa chọn ưu tiên cung cấp tuỳ chọn lựa chọn hai trạng thái. SwitchPreference mới là một tiện ích của TwoStatePreference, cung cấp tiện ích Switch trong khung hiển thị lựa chọn ưu tiên để cho phép người dùng bật hoặc tắt một chế độ cài đặt mà không cần mở thêm màn hình hoặc hộp thoại lựa chọn ưu tiên. Ví dụ: ứng dụng Cài đặt sử dụng SwitchPreference cho chế độ cài đặt Wi-Fi và Bluetooth.

Giao diện hệ thống

Giao diện mặc định cho tất cả ứng dụng nhắm đến Android 4.0 (bằng cách đặt targetSdkVersion hoặc minSdkVersion thành “14" trở lên) hiện là giao diện "mặc định của thiết bị": Theme.DeviceDefault. Đó có thể là giao diện Holo tối hoặc giao diện tối khác do thiết bị cụ thể xác định.

Nhóm giao diện Theme.Holo được đảm bảo sẽ không thay đổi giữa các thiết bị khi chạy cùng một phiên bản Android. Nếu bạn áp dụng rõ ràng bất kỳ giao diện Theme.Holo nào cho hoạt động của mình, thì bạn có thể yên tâm rằng các giao diện này sẽ không thay đổi ký tự trên các thiết bị khác nhau trong cùng một phiên bản nền tảng.

Nếu muốn ứng dụng của bạn hoà hợp với giao diện tổng thể của thiết bị (chẳng hạn như khi nhiều OEM cung cấp các giao diện mặc định khác nhau cho hệ thống), bạn nên áp dụng các giao diện từ nhóm Theme.DeviceDefault một cách rõ ràng.

Nút trình đơn tuỳ chọn

Kể từ Android 4.0, bạn sẽ nhận thấy điện thoại di động không còn yêu cầu nút phần cứng Trình đơn nữa. Tuy nhiên, bạn không cần phải lo lắng về điều này nếu ứng dụng hiện có của bạn cung cấp trình đơn tuỳ chọn và mong muốn có nút Trình đơn. Để đảm bảo các ứng dụng hiện có tiếp tục hoạt động như mong đợi, hệ thống cung cấp một nút Trình đơn trên màn hình cho các ứng dụng được thiết kế cho phiên bản Android cũ hơn.

Để có trải nghiệm người dùng tốt nhất, các ứng dụng mới và ứng dụng đã cập nhật nên sử dụng ActionBar để cung cấp quyền truy cập vào các mục trong trình đơn và đặt targetSdkVersion thành "14" để tận dụng các hành vi mặc định mới nhất của khung.

Các chế độ kiểm soát chế độ hiển thị giao diện người dùng hệ thống

Kể từ thời kỳ đầu của Android, hệ thống đã quản lý một thành phần trên giao diện người dùng gọi là thanh trạng thái (status bar), nằm ở đầu thiết bị điện thoại di động để cung cấp các thông tin như tín hiệu của nhà mạng, thời gian, thông báo, v.v. Android 3.0 đã thêm thanh hệ thống cho thiết bị máy tính bảng. Thanh này nằm ở cuối màn hình để cung cấp các chế độ điều khiển điều hướng hệ thống (Màn hình chính, Quay lại, v.v.) và cũng là giao diện cho các phần tử thường được thanh trạng thái cung cấp. Trong Android 4.0, hệ thống cung cấp một loại giao diện người dùng hệ thống mới có tên là thanh điều hướng. Bạn có thể coi thanh điều hướng là phiên bản đã tinh chỉnh của thanh hệ thống được thiết kế cho các thiết bị điện thoại di động. Thanh này cung cấp bộ điều khiển điều hướng cho các thiết bị không có bộ phận phần cứng để điều hướng hệ thống, nhưng lại bỏ qua giao diện người dùng thông báo của thanh hệ thống và các tuỳ chọn điều khiển cài đặt. Do đó, thiết bị cung cấp thanh điều hướng cũng có thanh trạng thái ở trên cùng.

Cho đến nay, bạn có thể ẩn thanh trạng thái trên điện thoại di động bằng cách sử dụng cờ FLAG_FULLSCREEN. Trong Android 4.0, các API kiểm soát chế độ hiển thị của thanh hệ thống đã được cập nhật để phản ánh tốt hơn hành vi của cả thanh hệ thống và thanh điều hướng:

  • Cờ SYSTEM_UI_FLAG_LOW_PROFILE thay thế cờ STATUS_BAR_HIDDEN. Khi được đặt, cờ này sẽ bật chế độ "cấu hình thấp" cho thanh hệ thống hoặc thanh điều hướng. Các nút điều hướng bị làm mờ và các thành phần khác trên thanh hệ thống cũng ẩn đi. Việc bật tính năng này sẽ hữu ích khi bạn tạo trò chơi sống động hơn mà không gây phân tâm đối với các nút điều hướng trên hệ thống.
  • Cờ SYSTEM_UI_FLAG_VISIBLE thay thế cờ STATUS_BAR_VISIBLE để yêu cầu hiển thị thanh hệ thống hoặc thanh điều hướng.
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION là một cờ mới yêu cầu ẩn hoàn toàn thanh điều hướng. Xin lưu ý rằng tính năng này chỉ hoạt động với thanh điều hướng mà một số điện thoại di động sử dụng (thanh này không ẩn thanh hệ thống trên máy tính bảng). Thanh điều hướng sẽ quay lại xem ngay khi hệ thống nhận được hoạt động đầu vào của người dùng. Do đó, chế độ này chủ yếu hữu ích khi phát video hoặc các trường hợp khác cần toàn bộ màn hình nhưng không bắt buộc phải có hoạt động đầu vào của người dùng.

Bạn có thể thiết lập từng cờ này cho thanh hệ thống và thanh điều hướng bằng cách gọi setSystemUiVisibility() trên bất kỳ khung hiển thị nào trong hoạt động. Trình quản lý cửa sổ kết hợp (OR kết hợp) tất cả cờ từ mọi khung hiển thị trong cửa sổ và áp dụng các cờ đó cho giao diện người dùng hệ thống, miễn là cửa sổ của bạn có tiêu điểm nhập. Khi cửa sổ mất tiêu điểm nhập (người dùng di chuyển khỏi ứng dụng hoặc một hộp thoại xuất hiện), cờ của bạn sẽ ngừng hoạt động. Tương tự, nếu bạn xoá các khung hiển thị đó khỏi hệ phân cấp khung hiển thị, thì cờ của chúng sẽ không còn áp dụng nữa.

Để đồng bộ hoá các sự kiện khác trong hoạt động của bạn với các thay đổi về chế độ hiển thị đối với giao diện người dùng hệ thống (ví dụ: ẩn thanh thao tác hoặc các thành phần điều khiển giao diện người dùng khác khi giao diện người dùng hệ thống ẩn), bạn nên đăng ký View.OnSystemUiVisibilityChangeListener để được thông báo khi chế độ hiển thị của thanh hệ thống hoặc thanh điều hướng thay đổi.

Xem lớp OverscanActivity để minh hoạ các tuỳ chọn giao diện người dùng hệ thống.

Khung đầu vào

Android 4.0 thêm tính năng hỗ trợ các sự kiện di con trỏ cũng như các sự kiện mới đối với bút cảm ứng và nút chuột.

Sự kiện di chuột

Lớp View hiện hỗ trợ các sự kiện "di chuột" để cho phép các hoạt động tương tác phong phú hơn thông qua việc sử dụng các thiết bị con trỏ (chẳng hạn như chuột hoặc các thiết bị khác điều khiển con trỏ trên màn hình).

Để nhận các sự kiện di chuột trên một khung hiển thị, hãy triển khai View.OnHoverListener và đăng ký khung hiển thị đó bằng setOnHoverListener(). Khi một sự kiện di chuột xảy ra trên khung hiển thị, trình nghe sẽ nhận được lệnh gọi đến onHover(), cung cấp View đã nhận được sự kiện và MotionEvent mô tả loại sự kiện di chuột đã xảy ra. Sự kiện di chuột có thể là một trong những sự kiện sau:

View.OnHoverListener của bạn phải trả về giá trị true từ onHover() nếu xử lý sự kiện di chuột. Nếu trình nghe của bạn trả về giá trị false, thì sự kiện di chuột sẽ được gửi đến khung hiển thị mẹ như thường lệ.

Nếu ứng dụng của bạn dùng các nút hoặc tiện ích khác thay đổi giao diện dựa trên trạng thái hiện tại, thì giờ đây, bạn có thể dùng thuộc tính android:state_hovered trong đối tượng có thể vẽ trong danh sách trạng thái để cung cấp một đối tượng có thể vẽ trong danh sách trạng thái khác khi con trỏ di chuột qua khung hiển thị.

Để xem minh hoạ về các sự kiện di chuột mới, hãy xem lớp Di chuột trong Apidemos.

Sự kiện bằng bút cảm ứng và nút chuột

Android nay cung cấp các API để nhận phương thức nhập từ thiết bị nhập bằng bút cảm ứng, chẳng hạn như thiết bị ngoại vi của máy tính bảng số hoá hoặc màn hình cảm ứng hỗ trợ bút cảm ứng.

Phương thức nhập bằng bút cảm ứng hoạt động tương tự như phương thức nhập bằng cách chạm hoặc bằng chuột. Khi bút cảm ứng tiếp xúc với bộ số hoá, các ứng dụng sẽ nhận được sự kiện chạm giống như khi bút cảm ứng được dùng để chạm vào màn hình. Khi bút cảm ứng di ở phía trên bộ số hoá, các ứng dụng sẽ nhận được các sự kiện di chuột giống như khi con trỏ chuột di chuyển qua màn hình trong trường hợp không nhấn nút nào.

Ứng dụng của bạn có thể phân biệt giữa phương thức nhập bằng ngón tay, chuột, bút cảm ứng và tẩy bằng cách truy vấn "loại công cụ" liên kết với từng con trỏ trong MotionEvent bằng getToolType(). Các loại công cụ hiện được xác định là: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE, TOOL_TYPE_STYLUSTOOL_TYPE_ERASER. Bằng cách truy vấn loại công cụ, ứng dụng của bạn có thể chọn xử lý phương thức nhập bằng bút cảm ứng theo nhiều cách, từ nhập bằng ngón tay hoặc bằng chuột.

Ứng dụng của bạn cũng có thể truy vấn xem người dùng nhấn nút chuột hoặc bút cảm ứng nào bằng cách truy vấn "trạng thái nút" của MotionEvent thông qua getButtonState(). Các trạng thái nút hiện được xác định là: BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACKBUTTON_FORWARD. Để thuận tiện, các nút chuột lùi và tiến sẽ tự động được liên kết với các phím KEYCODE_BACKKEYCODE_FORWARD. Ứng dụng của bạn có thể xử lý các phím này để hỗ trợ tính năng điều hướng tiến và lùi dựa trên nút chuột.

Ngoài việc đo chính xác vị trí và áp lực của một điểm tiếp xúc, một số thiết bị nhập bằng bút cảm ứng còn báo cáo khoảng cách giữa đầu bút cảm ứng và bộ số hoá, góc nghiêng của bút cảm ứng và góc hướng của bút cảm ứng. Ứng dụng của bạn có thể truy vấn thông tin này bằng getAxisValue() với các mã trục AXIS_DISTANCE, AXIS_TILTAXIS_ORIENTATION.

Để xem minh hoạ về các loại công cụ, trạng thái nút và mã trục mới, hãy xem lớp TouchPaint trong Apidemos.

Thuộc tính

Lớp Property mới cung cấp một cách nhanh chóng, hiệu quả và dễ dàng để chỉ định một thuộc tính trên bất kỳ đối tượng nào cho phép phương thức gọi đặt/nhận giá trị chung trên các đối tượng mục tiêu. Thao tác này cũng cho phép chức năng chuyển tham chiếu trường/phương thức và cho phép mã đặt/nhận giá trị của thuộc tính mà không cần biết thông tin chi tiết về các trường/phương thức đó.

Ví dụ: nếu muốn đặt giá trị của trường bar trên đối tượng foo, trước đây bạn sẽ phải làm như sau:

Kotlin

foo.bar = value

Java

foo.bar = value;

Nếu muốn gọi phương thức setter cho một trường riêng tư cơ bản bar, trước đây bạn sẽ thực hiện việc này:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

Tuy nhiên, nếu bạn muốn chuyển xung quanh thực thể foo và đặt một số mã khác đặt giá trị bar, thì thực sự không có cách nào để thực hiện việc này trước Android 4.0.

Bằng cách sử dụng lớp Property, bạn có thể khai báo đối tượng Property BAR trên lớp Foo để có thể đặt trường trên bản sao foo của lớp Foo như sau:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

Lớp View hiện tận dụng lớp Property để cho phép bạn đặt nhiều trường, chẳng hạn như các thuộc tính biến đổi đã được thêm vào Android 3.0 (ROTATION, ROTATION_X, TRANSLATION_X, v.v.).

Lớp ObjectAnimator cũng sử dụng lớp Property, để bạn có thể tạo ObjectAnimator với Property, cách này nhanh hơn, hiệu quả hơn và an toàn hơn về loại so với phương pháp dựa trên chuỗi.

Tăng tốc phần cứng

Kể từ Android 4.0, tính năng tăng tốc phần cứng cho tất cả cửa sổ sẽ được bật theo mặc định nếu ứng dụng của bạn đã đặt targetSdkVersion hoặc minSdkVersion thành “14" trở lên. Tính năng tăng tốc phần cứng thường mang lại ảnh động và quá trình cuộn mượt mà hơn, đồng thời hiệu suất tổng thể và khả năng phản hồi tốt hơn với hoạt động tương tác của người dùng.

Nếu cần, bạn có thể tắt tính năng tăng tốc phần cứng theo cách thủ công bằng thuộc tính hardwareAccelerated cho từng phần tử <activity> hoặc phần tử <application>. Ngoài ra, bạn có thể tắt tính năng tăng tốc phần cứng cho từng khung hiển thị bằng cách gọi setLayerType(LAYER_TYPE_SOFTWARE).

Để biết thêm thông tin về tính năng tăng tốc phần cứng, bao gồm cả danh sách các thao tác vẽ không được hỗ trợ, hãy xem tài liệu về Tăng tốc phần cứng.

Các thay đổi về JNI

Trong các phiên bản Android trước, các tệp tham chiếu cục bộ JNI không phải là trình xử lý gián tiếp; Android đã sử dụng con trỏ trực tiếp. Đây không phải là vấn đề, miễn là trình thu gom rác không di chuyển các đối tượng, nhưng có vẻ như trình thu gom này hoạt động vì nó cho phép viết mã bị lỗi. Trong Android 4.0, hệ thống hiện sử dụng các tham chiếu gián tiếp để phát hiện các lỗi này.

Bạn có thể xem nội dung về tệp đối chiếu cục bộ của JNI và phần "Tham chiếu cục bộ và chung" trong phần Mẹo về JNI. Trong Android 4.0, chúng tôi đã cải tiến CheckJNI để phát hiện những lỗi này. Hãy xem Blog dành cho nhà phát triển Android để biết một bài đăng sắp tới về các lỗi thường gặp với tệp tham chiếu JNI và cách khắc phục.

Thay đổi này trong quá trình triển khai JNI chỉ ảnh hưởng đến các ứng dụng nhắm đến Android 4.0 bằng cách đặt targetSdkVersion hoặc minSdkVersion thành “14" trở lên. Nếu bạn thiết lập các thuộc tính này thành bất kỳ giá trị nào thấp hơn, thì các lượt tham chiếu cục bộ của JNI sẽ hoạt động giống như trong các phiên bản trước.

Chỉ số WebKit

  • Đã cập nhật WebKit lên phiên bản 534.30
  • Hỗ trợ phông chữ tiếng Ấn Độ (Devanagari, Bengali và Tamil, bao gồm cả việc hỗ trợ ký tự phức tạp cần thiết để kết hợp các ký tự) trong WebView và Trình duyệt tích hợp sẵn
  • Hỗ trợ phông chữ Ethiopic, Georgia và Armenia trong WebView và Trình duyệt tích hợp sẵn
  • Tính năng hỗ trợ WebDriver giúp bạn dễ dàng kiểm thử các ứng dụng sử dụng WebView

Trình duyệt trên Android

Ứng dụng trình duyệt thêm các tính năng sau để hỗ trợ các ứng dụng web:

Quyền

Sau đây là các quyền mới:

Tính năng của thiết bị

Sau đây là các tính năng mới của thiết bị:

  • FEATURE_WIFI_DIRECT: Khai báo rằng ứng dụng dùng Wi-Fi để giao tiếp ngang hàng.

Để xem chi tiết tất cả các thay đổi về API trong Android 4.0 (API cấp 14), hãy xem Báo cáo điểm khác biệt về API.

API trước

Ngoài mọi thứ nêu trên, Android 4.0 hỗ trợ tất cả các API của các bản phát hành trước một cách tự nhiên. Vì nền tảng Android 3.x chỉ dành cho các thiết bị màn hình lớn, nên nếu chủ yếu phát triển cho điện thoại di động thì có thể bạn chưa biết đến mọi API được thêm vào Android trong các bản phát hành gần đây.

Sau đây là một số API đáng chú ý nhất mà bạn có thể đã bỏ lỡ, hiện cũng có sẵn trên điện thoại di động:

Android 3.0
  • Fragment: Một thành phần khung cho phép bạn tách riêng các phần tử của một hoạt động thành các mô-đun độc lập xác định giao diện người dùng và vòng đời riêng của các phần tử đó. Xem hướng dẫn cho nhà phát triển về Mảnh.
  • ActionBar: Thay thế cho thanh tiêu đề truyền thống ở đầu cửa sổ hoạt động. Biểu trưng này bao gồm biểu trưng của ứng dụng ở góc bên trái và cung cấp giao diện mới cho các mục trong trình đơn. Xem hướng dẫn cho nhà phát triển Thanh thao tác.
  • Loader: Một thành phần khung hỗ trợ tải dữ liệu không đồng bộ kết hợp với các thành phần giao diện người dùng để chủ động tải dữ liệu mà không chặn luồng chính. Xem hướng dẫn cho nhà phát triển Trình tải.
  • Bảng nhớ tạm của hệ thống: Các ứng dụng có thể sao chép và dán dữ liệu (không chỉ là văn bản) vào và từ bảng nhớ tạm trên toàn hệ thống. Dữ liệu bị cắt có thể là văn bản thuần tuý, URI hoặc ý định. Xem hướng dẫn cho nhà phát triển Sao chép và dán.
  • Kéo và thả: Một tập hợp API được tích hợp vào khung chế độ xem để hỗ trợ các thao tác kéo và thả. Xem hướng dẫn cho nhà phát triển Kéo và thả.
  • Khung ảnh động linh hoạt hoàn toàn mới cho phép bạn tạo ảnh động cho các thuộc tính tuỳ ý của mọi đối tượng (Xem, Có thể vẽ, Mảnh, Đối tượng hoặc bất kỳ đối tượng nào khác) và xác định các khía cạnh của ảnh động như thời lượng, nội suy, lặp lại và nhiều đối tượng khác. Khung mới làm cho Ảnh động trong Android trở nên đơn giản hơn bao giờ hết. Xem hướng dẫn cho nhà phát triển Ảnh động thuộc tính.
  • Công cụ điện toán và đồ hoạ RenderScript: RenderScript cung cấp API tính toán và kết xuất đồ hoạ 3D hiệu suất cao ở cấp độ gốc mà bạn viết trong C (tiêu chuẩn C99), cung cấp loại hiệu suất mà bạn mong đợi từ môi trường gốc trong khi vẫn có thể di chuyển trên nhiều CPU và GPU. Xem hướng dẫn cho nhà phát triển RenderScript.
  • Đồ hoạ 2D được tăng tốc phần cứng: Giờ đây, bạn có thể bật trình kết xuất OpenGL cho ứng dụng của mình bằng cách đặt {android:hardwareAccelerated="true"} trong phần tử <application> của phần tử tệp kê khai hoặc cho từng phần tử <activity> riêng lẻ. Điều này giúp ảnh động và khả năng cuộn mượt mà hơn, đồng thời cải thiện hiệu suất và phản hồi tổng thể khi người dùng tương tác.

    Lưu ý: Nếu bạn đặt minSdkVersion hoặc targetSdkVersion của ứng dụng thành "14" trở lên, thì tính năng tăng tốc phần cứng sẽ được bật theo mặc định.

  • Và nhiều, nhiều hơn nữa. Hãy xem ghi chú về Nền tảng Android 3.0 để biết thêm thông tin.
Android 3.1
  • API USB: Các API mới, mạnh mẽ để tích hợp các thiết bị ngoại vi đã kết nối với ứng dụng Android. Các API này dựa trên ngăn xếp USB và các dịch vụ được tích hợp vào nền tảng, bao gồm khả năng hỗ trợ cả hoạt động tương tác với thiết bị và máy chủ USB. Xem hướng dẫn cho nhà phát triển Máy chủ và phụ kiện USB.
  • API MTP/PTP: Các ứng dụng có thể tương tác trực tiếp với các máy ảnh đã kết nối và các thiết bị PTP khác để nhận thông báo khi các thiết bị được đính kèm và bị xoá, quản lý các tệp và dung lượng lưu trữ trên các thiết bị đó, cũng như chuyển các tệp và siêu dữ liệu giữa các thiết bị đó. API MTP triển khai tập hợp con PTP (Giao thức truyền hình ảnh) của thông số kỹ thuật MTP (Giao thức truyền nội dung nghe nhìn). Xem tài liệu android.mtp.
  • API RTP: Android cho thấy một API với ngăn xếp RTP (Giao thức truyền tải theo thời gian thực) tích hợp sẵn. Các ứng dụng này có thể dùng để quản lý hoạt động truyền dữ liệu theo yêu cầu hoặc tương tác. Cụ thể, các ứng dụng cung cấp tính năng VOIP, tính năng đẩy để nói, hội nghị truyền hình và truyền trực tuyến âm thanh có thể sử dụng API này để bắt đầu phiên và truyền hoặc nhận luồng dữ liệu qua bất kỳ mạng nào có sẵn. Xem tài liệu android.net.rtp.
  • Hỗ trợ cần điều khiển và các đầu vào chuyển động chung khác.
  • Hãy xem ghi chú về Nền tảng Android 3.1 để biết nhiều API mới khác.
Android 3.2
  • Màn hình mới hỗ trợ các API cho phép bạn kiểm soát tốt hơn cách ứng dụng của mình hiển thị trên nhiều kích thước màn hình. API này mở rộng mô hình hỗ trợ màn hình hiện có nhờ khả năng nhắm mục tiêu chính xác các phạm vi kích thước màn hình cụ thể theo kích thước, được đo bằng đơn vị pixel không phụ thuộc vào mật độ (chẳng hạn như 600 dp hoặc 720 dp rộng), thay vì theo kích thước màn hình chung (chẳng hạn như lớn hoặc rất lớn). Ví dụ: điều này rất quan trọng để giúp bạn phân biệt giữa thiết bị 5 inch và thiết bị 7". Theo truyền thống, cả hai thiết bị này sẽ được nhóm là màn hình "lớn". Hãy xem bài đăng trên blog Các công cụ mới để quản lý kích thước màn hình.
  • Hằng số mới cho <uses-feature> để khai báo yêu cầu về hướng màn hình ngang hoặc dọc.
  • Cấu hình "kích thước màn hình" của thiết bị hiện thay đổi khi hướng màn hình thay đổi. Nếu ứng dụng của bạn nhắm đến API cấp 13 trở lên, thì bạn phải xử lý thay đổi về cấu hình "screenSize" nếu cũng muốn xử lý thay đổi về cấu hình "orientation". Hãy xem android:configChanges để biết thêm thông tin.
  • Xem ghi chú về Nền tảng Android 3.2 để biết các API mới khác.

Cấp độ API:

API Android 4.0 được chỉ định một giá trị nhận dạng số nguyên (14) được lưu trữ trong chính hệ thống. Giá trị nhận dạng này được gọi là "cấp độ API" cho phép hệ thống xác định chính xác liệu một ứng dụng có tương thích với hệ thống hay không trước khi cài đặt ứng dụng.

Để dùng các API được giới thiệu trong Android 4.0 trong ứng dụng của mình, bạn cần biên dịch ứng dụng trên một nền tảng Android hỗ trợ API cấp 14 trở lên. Tuỳ thuộc vào nhu cầu của mình, bạn cũng có thể cần thêm thuộc tính android:minSdkVersion="14" vào phần tử <uses-sdk>.

Để biết thêm thông tin, hãy đọc bài viết Cấp độ API là gì?