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à ứng dụng nhà phát triển. Bên cạnh tất cả các tính năng và API mới được thảo luận bên dưới, Android 4.0 là một vì nó mang đến một bộ API mở rộng và chủ đề Holographic từ Android 3.x sang màn hình nhỏ hơn. Là nhà phát triển ứng dụng, bạn hiện có một nền tảng duy nhất và khung API hợp nhất cho phép bạn phát triển và xuất bản ứng dụng bằng một APK duy nhất cung cấp tối ưu hoá trải nghiệm người dùng 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 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 tập hợp giao diện trình mô phỏng và 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 xuống SDK của bạn.

Tổng quan về API

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

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

Các API liên hệ do nhà cung cấp ContactsContract xác định đã được được mở rộng để hỗ trợ các tính năng mới hướng đến xã hội như hồ sơ cá nhân cho chủ sở hữu thiết bị và khả năng người dùng mời các địa chỉ liên hệ cá nhân vào các 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 bởi bảng ContactsContract.Profile. Những ứng dụng xã hội duy trì danh tính người dùng có thể đóng góp cho dữ liệu hồ sơ của người dùng bằng cách tạo một mục nhập ContactsContract.RawContacts mới trong ContactsContract.Profile. Tức là những người liên hệ thô biểu thị hoạt động của người dùng thiết bị không thuộc bảng danh bạ thô truyền thống do URI ContactsContract.RawContacts xác định; thay vào đó, bạn phải thêm một người liên hệ thô trong hồ sơ bảng tại CONTENT_RAW_CONTACTS_URI. Thô địa chỉ liên hệ trong bảng này sau đó được tổng hợp vào một hồ sơ hiển thị cho người dùng có gắn nhãn "Tôi".

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

Ý định mời

Thao tác theo ý định INVITE_CONTACT cho phép một ứng dụng để gọi ra một hành động cho biết người dùng muốn thêm địa chỉ liên hệ vào mạng xã hội. Ứng dụng nhận được ứng dụng này sẽ sử dụng ứng dụng đó để mời người liên hệ được chỉ định tham gia mạng xã hội đó. Hầu hết các ứng dụng sẽ hoàn tất thao tác này. Ví dụ: ứng dụng Danh bạ 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 cụ thể ứng dụng mạng xã hội được liệt kê trong thông tin liên hệ của một người.

Để ứng dụng của bạn xuất hiện trong danh sách "Thêm kết nối", ứng dụng phải cung cấp trình chuyển đổi đồ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 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 người liên hệ có liên quan từ dữ liệu của ý định và thực hiện công việc cần thiết để mời người liên hệ đó vào mạng hoặc thêm người đó vào danh bạ 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 dùng cho người liên hệ. Giờ đây, khi bạn đẩy ảnh vào hồ sơ tiếp xúc, hệ thống sẽ xử lý nó thành cả hình thu nhỏ 96x96 (như trước đây) và một 256x256 "hiển thị ảnh" được lưu trữ trong một kho ảnh mới dạng tệp (kích thước chính xác mà hệ thống lựa 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 ảnh lớn vào cột PHOTO thông thường của hàng dữ liệu. Sau đó, hệ thống sẽ xử lý ảnh đó thành hình thu nhỏ thích hợp và hiển thị bản ghi ảnh.

Ý kiến phản hồi về việc sử dụng danh bạ

Các 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 của từng phương thức liên hệ liên kết với từng người và đưa ra các đề xuất phù hợp 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à xoá 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ể dùng những API này để đọc và sửa đổi các sự kiện trê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á đồ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 một vị trí hợp nhất cho tất cả các sự kiện của người dùng. Ví dụ: các sự kiện trên Lịch Google được đồng bộ hoá với Nhà cung cấp lịch bằng Adapter đồng bộ hoá Lịch Google, cho phép xem các sự kiện này bằng ứng dụng Lịch tích hợp sẵn 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 được xác định bằng CalendarContract. 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, 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 về 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 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à các 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 chúng với sự kiện.
  • Bảng CalendarContract.Instances chứa thời gian bắt đầu và kết thúc của các lần xuất hiện 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 sự kiện diễn ra một lần có mối liên kết một với một giữa các thực thể với sự kiện. Đối với các sự kiện định kỳ, nhiều hàng sẽ được tạo tự động để 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ề khách mời hoặc người tham dự sự kiện. Mỗi hàng đại diện cho một khách mời của một sự kiện. Thuộc tính này chỉ định loại khách mời và phản hồi của khách mời đối với 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á thiết lập sở hữu lịch đã cho. Thông báo nhắc được chỉ định bằng 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 tin nhắn SMS để nhắc người dùng.
  • Bảng CalendarContract.ExtendedProperties chứa các trường dữ liệu không rõ ràng được sử dụng bởi bộ điều hợp đồng bộ hoá. Nhà cung cấp không làm gì với các mục trong bảng này, ngoại trừ việc xoá khi các sự kiện có liên quan của chúng bị xoá.

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

Ý định sự kiện

Nếu tất cả những gì bạn muốn làm là 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 trong ứng dụng Lịch tạo sự kiện mới. Việc sử dụng ý định này không yêu cầu và bạn có thể chỉ định chi tiết sự kiện bằng các dữ liệu bổ sung sau:

Nhà cung cấp dịch vụ thư thoại

Trì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ị để trình bày 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ể là một người dùng có nhiều nguồn thư thoại, chẳng hạn như một cuộc gọi từ nhà cung cấp dịch vụ của điện thoại và một số khác từ VoIP hoặc giọng nói thay thế khác luôn miễn phí. Các ứng dụng này có thể sử dụng API Nhà cung cấp thư thoại để thêm thư thoại của chúng vào thiết bị. Chiến lược phát hành đĩa đơn ứng dụng Điện thoại tích hợp sẵn thì sẽ hiển thị tất cả thư thoại cho người dùng ở dạng 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 thư thoại mà ứ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).

Do hiện tại, API không cho phép ứng dụng bên thứ ba đọc tất cả thư thoại từ hệ thống, ứng dụng bên thứ ba duy nhất nên sử dụng API thư thoại là các ứng dụng có thư thoại cung cấp cho người dùng.

Lớp VoicemailContract xác định trình cung cấp nội dung cho Chuyên gia đánh giá 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ị. Để biết ví dụ về ứng dụng của nhà cung cấp dịch vụ thư thoại, hãy xem Bản minh hoạ nhà cung cấp dịch vụ thư thoại.

Đ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 đa phương tiện như ảnh, video và nhạc.

Hiệu ứng nội dung nghe nhìn

Khung hiệu ứng nội dung đa phương tiện mới giúp bạn áp dụng nhiều hiệu ứng hình ảnh cho hình ảnh và video. Ví dụ: các hiệu ứng hình ảnh giúp bạn dễ dàng khắc phục tình trạng mắt đỏ, chuyển đổi hình ảnh thành 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à hơn thế nữa. Chiến lược phát hành đĩa đơn hệ thống thực hiện tất cả việc 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ệ thì mới có thể sử dụng các API hiệu ứng. Hoạ tiết mà bạn áp dụng hiệu ứng có thể từ bitmap, video hoặc thậm chí từ camera. Tuy nhiên, có một số hạn chế nhất định mà hoạ tiết phải đáp ứng:

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

Đối tượng Effect xác định một hiệu ứng nội dung nghe nhìn mà bạn có thể áp dụng cho 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() (trả về một thực thể) trong tổng số 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 một 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 đều chấp nhận các thông số khác nhau, được ghi lại cùng với tên hiệu ứng. Ví dụ: EFFECT_FISHEYE có một tham số cho scale của thuộc tính biến dạng.

Để áp dụng hiệu ứng cho hoạ tiết, hãy gọi apply() trên Effect rồi truyền vào hoạ tiết đầu vào, chiều rộng và chiều cao, cùng kết quả đầu ra hoạ tiết. Hoạ tiết đầu vào phải được liên kết với hoạ tiết GL_TEXTURE_2D hình ảnh (thường được thực hiện bằng cách gọi 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 một hình ảnh kết cấu, hình ảnh này sẽ tự động được liên kết bởi hiệu ứng dưới dạng GL_TEXTURE_2D và có một cấp mipmap (0). Ảnh này sẽ có cùng làm dữ liệu đầu vào.

Tất cả hiệu ứng được liệt kê trong EffectFactory đều được đảm bảo được hỗ trợ. Tuy nhiên, một số hiệu ứng bổ sung có sẵn từ thư viện bên ngoài không được tất cả thiết bị hỗ trợ, nên 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().

Máy khách điều khiển từ xa

RemoteControlClient mới cho phép trình phát nội dung nghe nhìn bật các chế độ điều khiển phát từ ứng dụng điều khiển từ xa, chẳng hạn như màn hình khoá 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ư đường đi thông tin 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 của bạn, hãy tạo thực thể cho RemoteControlClient bằng hàm khởi tạo của nó, truyền vào đó PendingIntent sẽ truyền tin ACTION_MEDIA_BUTTON. Ý định cũng phải khai báo thành phần BroadcastReceiver rõ ràng trong ứng dụng của bạn để xử lý sự kiện ACTION_MEDIA_BUTTON.

Để khai báo phương thức nhập điều khiển nội dung nghe nhìn 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ờ 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ã này đến MediaManager.registerRemoteControlClient(). Sau khi đăng ký, broadcast receiver mà bạn khai báo khi tạo bản sao RemoteControlClient sẽ nhận được các sự kiện ACTION_MEDIA_BUTTON khi người dùng nhấn nút trên điều khiển từ xa. Ý định mà bạn nhận được bao gồm KeyEvent cho phím đa phương tiện được nhấn. Bạn có thể truy xuất ý định này từ getParcelableExtra(Intent.EXTRA_KEY_EVENT).

Để hiển thị thông tin trên điều khiển từ xa về nội dung nghe nhìn đ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 nghe nhìn, thông tin dạng số như thời gian đã trôi qua và thông tin dạng văn bản như tên bản nhạc. Để thông tin về các khoá hiện có sẽ thấy cờ METADATA_KEY_* trong MediaMetadataRetriever.

Để triển khai mẫu, hãy xem Trình phát nhạc ngẫu nhiên, cung cấp logic tương thích để nó cho phép ứng dụng điều khiển từ xa trên Android 4.0 thiết bị trong khi vẫn tiếp tục hỗ trợ 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 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 INTERNET quyền vào tệp kê khai, nếu không thì tính năng phát nội dung nghe nhì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 các tiêu đề HTTP bổ sung cùng với 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)
  • Tính năng phát trực tiếp 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 bổ sung hỗ trợ cho:

  • 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 Phương tiện được hỗ trợ Định dạng.

Camera

Lớp Camera hiện bao gồm các API để phát hiện khuôn mặt và điều khiển vùng lấy nét và đo sáng.

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

Giờ đây, các ứng dụng camera có thể nâng cao khả năng của mình nhờ API phát hiện khuôn mặt của Android, vốn không được hỗ trợ chỉ phát hiện khuôn mặt của đối tượng, nhưng cũng 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ể bắt đầu bề mặt camera và bắt đầu phát hiệ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 cung cấp nhiều thông tin về khuôn mặt được phát hiện, trong đó có:

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

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ợ việc xác định mắt và miệng. Trong trường hợp đó, các trường đó trong đối tượng Camera.Face sẽ có giá trị rỗng.

Vùng lấy nét và đo sáng

Giờ đây, các ứng dụng máy ảnh có thể kiểm soát các khu vực mà máy ảnh sử dụng để lấy nét và đo sáng cân bằng trắng cũng như 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 của chế độ xem hiện tại của máy ảnh cần lấy nét hoặc đo sáng. Một thực thể của lớp Camera.Area 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 được xem xét—với một số nguyên.

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

Để chỉ định vùng lấy nét hoặc đo sáng cần sử dụng, bạn chỉ cần gọi setFocusAreas() hoặc setMeteringAreas(). Mỗi đối tượng lấy một List của các đối tượng Camera.Area cho biết các 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 chạm vào một vùng trong bản xem trước, sau đó bạn sẽ dịch vùng đó 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 truyền FOCUS_MODE_CONTINUOUS_PICTURE đến setFocusMode(). Khi bạn đã sẵn sàng chụp ảnh, hãy gọi autoFocus(). Camera.AutoFocusCallback của bạn sẽ ngay lập tức nhận được lệnh gọi lại để cho biết liệu đã đạt được trọng tâm. Để 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 chụp ảnh video, sử dụng FOCUS_MODE_CONTINUOUS_VIDEO, vốn là đã thêm vào API cấp 9.

Các tính năng khác của máy ảnh

  • Giờ đây, trong khi quay video, bạn có thể gọi takePicture() để lưu ảnh mà không làm gián đoạn phiên quay video. Trước khi làm như vậy, bạn nên gọi isVideoSnapshotSupported() để đảm bảo phần cứng hỗ trợ nó.
  • Giờ đây, bạn có thể khoá chế độ tự động phơi sá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() khi bản xem trước của máy ảnh đang chạy. Trước đây, bạn có thể gọi hàm này là chỉ 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 máy ảnh

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

Android Beam (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 (một quy trình còn được gọi là "NDEF Push"). Quá trình chuyển dữ liệu bắt đầu khi Các thiết bị chạy Android hỗ trợ tính năng Truyền tia Android đang ở gần (khoảng 4 cm), thường là với vai họ chạm vào nhau. Dữ liệu bên trong thông báo NDEF có thể chứa mọi dữ liệu mà bạn muốn chia sẻ giữa các thiết bị. Ví dụ: ứng dụng People chia sẻ danh bạ, YouTube chia sẻ video và trình duyệt chia sẻ URL bằng Android Beam.

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

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

    Gọi setNdefPushMessage() bất cứ lúc nào để thiết lập nội dung tin nhắn mà bạn muốn gửi. Ví dụ: bạn có thể gọi phương thức này và truyền phương thức này NdefMessage trong onCreate() của hoạt động . Sau đó, bất cứ khi nào 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 diễn ra trong ở nền trước, hệ thống sẽ gửi NdefMessage đến thiết bị khác.

  • Xác định NdefMessage để đẩ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 đó, hãy truyền quá trình triển khai NfcAdapter.CreateNdefMessageCallback cho setNdefPushMessageCallback().

    Trong trường hợp này, khi Android Beam được kích hoạt bằng một thiết bị khác trong khi hoạt động của bạn đang ở 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 một lần khi Android Beam được khởi tạo, trong trường hợp nội dung của thông báo có thể thay đổi trong suốt vòng đời của hoạt động.

Trong trường hợp muốn chạy một số mã cụ thể sau khi hệ thống phân phố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à đặt thông báo đó bằng setNdefPushCompleteCallback(). Hệ thống sẽ sau đó gọi onNdefPushComplete() khi tin nhắn được gửi.

Trên thiết bị nhận, hệ thống điều phối các thông báo NDEF Push theo cách tương tự như các thẻ NFC thông thường. Hệ thống 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 mà 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ề tính năng Tag Dispatch, hãy xem hướng dẫn dành cho nhà phát triển về NFC.

Nếu muốn NdefMessage mang theo một URI, giờ đây, bạn có thể sử dụng phương thức thuận tiện createUri để tạo một NdefRecord mới dựa trên một 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 nhận được trong sự kiện Truyền tia Android, 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 một lược đồ URI để nhận được tin nhắn NDEF đến.

Bạn cũng phải chuyển một "bản ghi ứng dụng Android" với NdefMessage của bạn trong nhằm đả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 nhau cho cùng một thao tác theo ý định. Bạn có thể tạo bản ghi ứng dụng Android bằng cách đang gọi createApplicationRecord(), truyền nó tên gói của ứng dụng. Khi thiết bị khác nhận được thông báo NDEF có 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 luôn phân phố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 phù hợp). Nếu thiết bị mục tiêu hiện chưa cài đặt ứng dụng của bạn, hệ thống sẽ sử dụng bản ghi ứng dụng Android để khởi chạy Google Play và đưa người dùng đến ứng dụng để cài đặt ứng dụng đó.

Nếu ứng dụng của bạn không sử dụng API NFC để thực hiện tính năng nhắn tin đẩy NDEF, thì Android sẽ cung cấp một hành vi mặc định: Khi ứng dụng của bạn 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 một thông báo NDEF có bản ghi ứng dụng Android xác định ứ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 chưa cài đặt, Google Play sẽ mở và đưa người dùng đến ứng dụng của bạn để cài đặt.

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 dành cho nhà phát triển Kiến thức cơ bản về NFC. Để biết một số mã ví dụ sử dụng Android Beam, hãy xem Bản minh hoạ Android Beam.

Wi-Fi P2P

Android hiện hỗ trợ kết nối Wi-Fi ngang hàng (P2P) giữa các thiết bị chạy Android và các loại thiết bị khác (tuân thủ Wi-Fi DirectTM của Liên minh Wi-Fi chương trình chứng nhận) mà không cần điểm phát sóng hoặc kết nối Internet. Khung Android cung cấp 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 một kết nối nhanh chóng giữa những khoảng cách dài hơn nhiều so với Kết nối Bluetooth.

Một gói mới, android.net.wifi.p2p, chứa tất cả các API để thực hiện kết nối ngang hàng bằng Wi-Fi. Lớp chính mà bạn cần làm việc 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 chạy ứng dụng cho các 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 discoverPeers()
  • Bắt đầu kết nối ngang hàng (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 khi một thao tác như khám phá các ứng dụng ngang hàng hoặc kết nối với các ứng dụng đó thành công hoặc không thành công.
  • Giao diện WifiP2pManager.PeerListListener cho phép bạn nhận về các ứng dụng ngang hàng được khám phá. Lệnh gọi lại cung cấp WifiP2pDeviceList mà 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 các 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 đối tượng WifiP2pGroup. Đối tượng này cung cấp thông tin nhóm 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, có thông tin như liệu một nhóm đã được được thành lập và ai là chủ sở hữu nhóm.

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

  • 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 các thiết bị ngang hàng Wi-Fi P2P bằng ổ cắm java tiêu chuẩn cần có quyền truy cập Internet).

Hệ thống Android cũng truyền một số thao tác trong một số sự kiện P2P Wi-Fi nhất định:

Hãy xem tài liệu WifiP2pManager để biết thêm thông tin. Ngoài ra, hãy xem ứng dụng mẫu Wi-Fi P2P Demo.

Thiết bị y tế Bluetooth

Android hiện hỗ trợ các thiết bị có Hồ sơ tình trạng Bluetooth, vì vậy, bạn có thể tạo các ứng dụng sử dụng Bluetooth để giao tiếp với các thiết bị y tế có 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ư tai nghe thông thường và thiết bị hồ sơ 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 hồ sơ.

Sau khi bạn có được proxy Hồ sơ sức khoẻ (BluetoothHealth ), 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: Lớp Bluetooth:

  • BluetoothHealthCallback: Bạn phải mở rộng lớp này và triển khai phương thức gọi lại để nhận thông tin cập nhật về những thay đổi trong trạng thái đăng ký của ứng dụng và Trạng thái kênh Bluetooth.
  • BluetoothHealthAppConfiguration: Trong các lệnh gọi lại đến BluetoothHealthCallback, bạn sẽ nhận được một thực thể của đối tượng này. cung cấp thông tin cấu hình về thiết bị Bluetooth hiện có mà bạn phải dùng để thực hiện nhiều thao tác như khởi tạo 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 về 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 chế độ xem 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 khiếm thị có thể khám phá màn hình bằng cách chạm và kéo 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 giống như con trỏ ảo, nó 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àn hình trình đọc có thể khi người dùng điều hướng bằng d-pad hoặc bi xoay – bằng cách đọc thông tin được cung cấp của android:contentDescriptionsetContentDescription() khi "di chuột" được mô phỏng sự kiện. 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 chế độ xem trong ứng dụng, đặc biệt là đối với ImageButton, EditText, ImageView và các tiện ích khác có thể không chứa nội dung mô tả .

Hỗ trợ tiếp cận cho các chế độ xem

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

Trước tiên, cần lưu ý rằng hành vi của phương thức sendAccessibilityEvent() đã thay đổi trong Android 4.0. Giống như phiên bản Android trướ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 như nhấp chuột hoặc di chuột xảy ra, thì chế độ xem 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 chạy AccessibilityEvent rồi gửi tới AccessibilityManager. Hành vi mới liên quan đến một số lệnh gọi lại bổ sung các phương thức cho phép khung hiển thị và thành phần mẹ thêm thông tin theo bối cảnh vào sự kiện:

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

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

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

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

  3. Tại thời điểm này, View chuyể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 thành phần hiển thị mẹ có cơ hội tăng cường thông tin hỗ trợ tiếp cận bằng cách thêm AccessibilityRecord, cho đến khi thành phần hiển thị mẹ này đạt đến thành phần hiển thị gốc, thành phần 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, rất 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 lệnh gọi lại sự kiện này trên thành phần 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 thành phần hiển thị sẽ trì hoãn lệnh gọi đến phương thức tương ứng trong trình uỷ quyền. Ví dụ: khi nhận được lệnh gọi đến onPopulateAccessibilityEvent(), thành phần 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 do phương thức uỷ quyền xử lý sẽ được trả về ngay cho thành phần hiển thị để thực hiện hành vi mặc định. Điều này cho phép bạn chỉ ghi đè các phương thức cần thiết cho bất kỳ thành phần hiển thị nào mà không cần mở rộng lớp View.

Nếu muốn duy trì 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 việc này bằng phiên bản mới nhất của thư viện hỗ trợ v4 (trong Gói tương thích, r4) bằng cách sử dụng một tập hợp các lớp tiện ích cung cấp các API hỗ trợ tiếp cận mới theo thiết kế tương thích ngược.

Dịch vụ hỗ trợ truy cập

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ể để cung cấp ý kiến phản hồi nâng cao hơn về khả năng hỗ trợ tiếp cận cho người dùng. Cụ thể, các sự kiện được tạo dựa trên thành phần hiển thị, cung cấp thông tin ngữ cảnh tốt hơn và cho phép các dịch vụ hỗ trợ tiếp cận di chuyển qua hệ phân cấp thành phần hiển thị để nhận thêm thông tin về thành phần 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), bạn có thể truy cập vào thông tin nội dung bổ sung và duyệt qua hệ thống phân cấp thành phần hiển thị theo quy trình sau:

  1. Sau khi nhận được AccessibilityEvent từ một đơn đăng ký, gọi AccessibilityEvent.getRecord() để truy xuất một AccessibilityRecord cụ thể (có thể có một số bản ghi được đí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ả các sự kiện trước đó nguồn.

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

Để ứng dụng của bạn tự xuất bản lên hệ thống dưới dạng dịch vụ hỗ trợ tiếp cậ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 dịch vụ hỗ trợ tiếp cận, 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ị, thì AccessibilityManager có một số API mới như:

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

Khung 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 trình kiểm tra chính tả mới, bạn phải triển khai dịch vụ mở rộng SpellCheckerService và mở rộng lớp SpellCheckerService.Session để cung cấp các đề xuất chính tả dựa trên trên văn bản do phương thức gọi lại của giao diện cung cấp. Trong các phương thức gọi lại SpellCheckerService.Session, bạn phải trả về các đề xuất về 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 thêm một phần tử <meta-data> khai báo thông tin cấu hình cho chính tả .

Xem mẫu ứng dụng Dịch vụ kiểm tra lỗi chính tả và mẫu Ứng dụng Kiểm tra lỗi chính tả cho ví dụ về mã.

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

Các 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 triển khai công cụ TTS tuỳ chỉnh dễ dàng hơn, trong khi các ứng dụng muốn sử dụng công cụ TTS có một số API mới để chọn công cụ.

Sử dụng 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 công cụ tuỳ chỉnh bằng setEngineByPackageName(). Trong Android 4.0, phương thức setEngineByPackageName() đã ngừng hoạt động và giờ đây, bạn có thể chỉ định công cụ để 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 đối tượng TextToSpeech.EngineInfo, trong đó có siêu dữ liệu như biểu tượng, nhãn và tên gói.

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

Trước đây, các công cụ tuỳ chỉnh yêu cầu xây dựng công cụ bằng cách sử dụng tiêu đề gốc không được ghi nhận tệp. 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. Chiến lược phát hành đĩa đơn công việc chính cho công cụ TTS diễn ra trong lệnh gọi lại onSynthesizeText() trong một dịch vụ mở rộng TextToSpeechService. Hệ thống phân phối cho phương thức này hai đối tượng:

  • SynthesisRequest: 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 độ lời nói và độ cao giọng nói.
  • SynthesisCallback: Đây là giao diện mà công cụ TTS phân phối dữ liệu lời nói thu được dưới dạng âm thanh phát trực tuyến. Trước tiên, công cụ phải gọi start() để cho biết 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 bộ đệm byte. Sau khi công cụ của bạn truyền tất cả âm thanh qua vùng đệm, hãy gọi done().

Giờ đây, khung này đã hỗ trợ một API thực để tạo công cụ TTS, hỗ trợ mã gốc đã bị xoá phương thức triển khai. Tìm một 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ô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 Công cụ chuyển văn bản sang lời nói.

Mức sử dụng mạng

Android 4.0 cung cấp cho người dùng thông tin chính xác về 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 đối với việc sử dụng dữ liệu mạng và thậm chí là vô hiệu hoá việc 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, thì bạn nên phát triển các chiến lược để sử dụng dữ liệu đó kết nối 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ài đặt người dùng cho phép người dùng kiểm soát thói quen sử dụng 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, cho dù chỉ thực hiện tải lên/tải xuống khi dùng Wi-Fi, cho dù có sử dụng dữ liệu khi chuyển vùng, v.v. Với những tính năng này nên 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 chúng đạt đến giới hạn vì chúng có thể kiểm soát chính xác lượng dữ liệu mà ứng dụng của bạn sử dụng. Nếu cung cấp một hoạt động lựa chọn ưu tiên thông qua các chế độ cài đặt này, bạn nên đưa vào tệp kê khai của hoạt động đó khai báo bộ lọc ý định cho ACTION_MANAGE_NETWORK_USAGE hành động. 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 từ Ứng dụng Cài đặt, "Xem chế độ cài đặt ứng dụng" 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 của bạn sử dụng.

Xin lưu ý rằng getBackgroundDataSetting() hiện là không dùng nữa và luôn trả về giá trị true, thay vào đó hãy 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ư liệu thiết bị có đang chuyển vùng hay kết nối với Wi-Fi hay không.

Doanh nghiệp

Android 4.0 mở rộng các tính năng sau đây dành cho ứng dụng doanh nghiệp.

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 Mạng riêng), chạy dưới dạng Service. Dịch vụ VPN tạo giao diện cho mạng ảo có địa chỉ và quy tắc định tuyến riêng, đồng thời thực hiện tất cả thao tác đọc và ghi bằng một chỉ số mô tả tệp.

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

Vì dịch vụ VPN có thể chặn gói dữ liệu, nên điều này sẽ ảnh hưởng đến khả năng bảo mật. Do đó, nếu bạn 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 dịch vụ đó (chỉ hệ thống mới được cấp quyền này – ứng dụng không thể yêu cầu quyền này). Sau đó, hãy làm như sau để sử dụng dịch vụ VPN: người dùng phải bật tính năng 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 với 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 trong kho khoá hệ thống. Chứng chỉ đơn giản hoá việc cài đặt cả ứng dụng chứng chỉ (để 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 nhận dạng máy chủ). Các ứng dụng như trình duyệt web hoặc ứng dụng email có thể truy cập vào các chứng chỉ để xác thực người dùng với máy chủ. Xem 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 trong Android 4.0:

  • TYPE_AMBIENT_TEMPERATURE: Cảm biến nhiệt độ cung cấp nhiệt độ môi trường xung quanh (trong phòng) tính bằng độ C.
  • TYPE_RELATIVE_HUMIDITY: Cảm biến độ ẩm cung cấp độ ẩm tương đối của môi trường xung quanh (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, thì bạn có thể 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) đã được không dùng nữa. Bạn nên dùng cảm biến TYPE_AMBIENT_TEMPERATURE thay thế.

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, chúng có độ trễ thấp hơn và đầu ra mượt mà hơn. Các 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ảm biến cải tiến dựa vào con quay hồi chuyển cảm biến để cải thiện đầu ra, vì vậy, cảm biến 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. Thường gặp nhất quan trọng là hệ thống quản lý dễ dàng kích thước và cấu hình của thanh tác vụ khi chạy trên màn hình nhỏ hơn nhằm cung cấp trải nghiệm người dùng tối ưu 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), thanh thao tác các thẻ điều hướng xuất hiện trong "thanh xếp chồng" xuất hiện ngay bên dưới thanh tác vụ chính. Bạn cũng có thể chọn sử dụng "thanh thao tác phân tách". Thanh này sẽ đặt tất cả các mục thao tác trong một thanh riêng ở cuối màn hình khi màn hình hẹp.

Thanh tác vụ chia tách

Nếu thanh thao tác bao gồm nhiều mục hành động và 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, vì vậy, hệ thống sẽ đặt thêm nhiều quảng cáo vào trình đơn mục bổ sung. Tuy nhiên, Android 4.0 cho phép bạn bật "thanh thao tác phân tách" để nhiều mục thao tác hơn có thể xuất hiện trên màn hình trong một thanh riêng ở cuối màn hình. Để bật thanh tác vụ phân tách, hãy thêm android:uiOptions cùng với "splitActionBarWhenNarrow" vào <application> hoặ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 hẹp (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 các thẻ điều hướng do API ActionBar.Tab cung cấp, nhưng không cần thanh tác vụ chính ở trên cùng (bạn chỉ muốn các thẻ xuất hiện ở trên cùng), sau đó bật thanh tác vụ chia tách như mô tả ở trên, đồng thời gọi setDisplayShowHomeEnabled(false) để vô hiệu hoá biểu tượng ứng dụng trong thanh tác vụ. Khi không còn mục nào trong thanh thao tác chính, thanh này 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 tác vụ

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 hoặc nền có thể vẽ cho thanh xếp chồng và thanh phân tách tương ứng. Bạn cũng có thể đặt các kiểu này tại thời gian chạy với 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. Nhà cung cấp hành động có thể xác định chế độ xem hành động, hành vi hành động mặc định và trình đơn con cho từng mục hành động được liên kết. Khi bạn muốn tạo một mục hành động có hành vi động (chẳng hạn như chế độ xem thao tác có thể thay đổi, thao tác 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 mục hành động khác nhau 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, giúp hỗ trợ thao tác "chia sẻ" từ 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 thao tác này để hiển thị khung hiển thị hành động kèm theo danh sách ứng dụng thả xuống có khả nă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ị thao tác để truy cập nhanh hơn vào tính năng chia sẻ với ứng dụng đó.

Để khai báo trình cung cấp thao tác cho một mục hành động, hãy thêm android:actionProviderClass trong phần tử <item> cho trình đơn tuỳ chọn của hoạt động kèm theo tên lớp của thao tác nhà cung cấp dịch vụ làm giá trị. 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 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);
}

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

Chế độ xem thao tác có thể thu gọn

Các mục hành động cung cấp chế độ xem hành động giờ đây có thể chuyển đổi giữa trạng thái chế độ xem hành động và trạng thái của mục hành động truyền thống. Trước đây, chỉ có SearchView được hỗ trợ 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 tác vụ đang hiển thị) và trạng thái thu gọn (mục hành động là hiển thị).

Để khai báo rằng một mục hành động chứa một khung hiển thị hành động có thể thu gọn, hãy đưa 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 thành phần hiển thị thao tác chuyển đổi giữa trạng thái mở rộng và thu gọn, hãy đăng ký một thực thể 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 thực hiện việc này trong lệnh gọi lại onCreateOptionsMenu().

Để kiểm soát chế độ xem thao tác có thể thu gọn, bạn có thể gọi collapseActionView()expandActionView() trên MenuItem tương ứng.

Khi tạo thành phần hiển thị thao tác 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 thành phần 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ề trang chủ hay "lên" không (chuyển "true" để làm cho URL hoạt động như nút).
  • setIcon()setLogo() cho phép bạn xác định biểu tượng hoặc biểu trưng 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ủa các mục trong trình đơn tuỳ chọn do mảnh khai báo. Điều này rất 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 các mục trong trình đơn phải được bị ẩn.
  • FragmentManager.invalidateOptionsMenu() cho phép bạn vô hiệu hoá trình đơn tuỳ chọn hoạt động trong nhiều trạng thái của vòng đời mảnh, trong đó có thể không sử dụng được 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à 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 đặ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 sử dụng các thành phần hiển thị trung gian như 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 mà chúng sẽ chiếm (các ô có thể trải dài trên nhiều hàng và/hoặc cột) và theo mặc định được bố trí tuần tự trên các hàng và cột của lưới. Hướng GridLayout xác định liệu các phần tử con tuần tự có phải là mặc định được bố trí theo chiều ngang hoặc chiều dọc. Bạn có thể chỉ định khoảng trống 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 các tham số lề liên quan trên các thành phần con.

Xem Apidemos cho các mẫu sử dụng GridLayout.

TextureView

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

Lưu ý rằng TextureView chỉ hoạt động trong 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 vào một bên cạnh hoặc bên kia (hoặc chỉ cần nhấn) để chuyển đổi một lựa chọn giữa hai trạng thái.

Bạn có thể dùng thuộc tính android:textOnandroid:textOff để chỉ định văn bản 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 dọc theo 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.xmlNút chuyển tương ứng hoạt động.

Android 3.0 đã giới thiệu PopupMenu để tạo trình đơn theo ngữ cảnh ngắn bật lên tại một đ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 bằng 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ừ mộ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 PopupMenu.OnDismissListener nhận gọi lại khi trình đơn bị đóng.

Lựa chọn ưu tiên

Một lớp trừu tượng TwoStatePreference mới là cơ sở cho cung cấp lựa chọn hai trạng thái. SwitchPreference mới là một phần mở rộng của TwoStatePreference, cung cấp tiện ích Switch trong chế độ xem 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ở màn hình hoặc hộp thoại tuỳ chọn. Ví dụ: ứng dụng Cài đặt sử dụng SwitchPreference cho các 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. Đây có thể là giao diện Holo tối hoặc một 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 từ thiết bị này sang thiết bị khác khi chạy cùng một phiên bản Android. Nếu bạn rõ ràng áp dụng bất kỳ giao diện nào trong số Theme.Holo giao diện cho hoạt động của mình, bạn có thể hãy yên tâm rằng những chủ đề này sẽ không thay đổi nhân vậ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 bạn muốn ứng dụng của mình hài hoà với giao diện tổng thể của thiết bị (chẳng hạn như khi các OEM khác nhau 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 rõ ràng các giao diện của nhóm Theme.DeviceDefault.

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 tại của bạn cung cấp trình đơn tuỳ chọn và 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 các phiên bản Android cũ.

Để mang lại trải nghiệm tốt nhất cho người dùng, các ứng dụng mới và 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ừ những ngày đầu của Android, hệ thống đã quản lý một thành phần giao diện người dùng có tên là thanh trạng thái. Thành phần này nằm ở đầu thiết bị cầm tay để cung cấp 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 các 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 nút điều khiển điều hướng hệ thống (Trang chủ, Quay lại, v.v.) và cũng là giao diện cho các thành phần do thanh trạng thái cung cấp theo truyền thống. Ngang bằng Trên Android 4.0, hệ thống này 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 được điều chỉnh lại của thanh hệ thống được thiết kế cho điện thoại di động. Thanh này cung cấp các nút điều khiển điều hướng cho các thiết bị không có phần cứng tương ứng để điều hướng hệ thống, nhưng bỏ qua giao diện người dùng thông báo và các nút điều khiển cài đặt của thanh hệ thống. Như vậy, một thiết bị cung cấp chức năng đ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 hoạt động 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 "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 sẽ bị mờ và các phần tử khác trong thanh hệ thống cũng sẽ ẩn. Đang bật điều này rất hữu ích khi tạo trò chơi sống động hơn mà không làm gián đoạn quá trình điều hướng của hệ thống các nút.
  • 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 thanh điều hướng ẩn hoàn toàn. Xin lưu ý rằng thao tác này chỉ hoạt động với thanh điều hướng được một số điện thoại di động sử dụng (tính năng này không ẩn thanh hệ thống trên máy tính bảng). Điều hướng thanh sẽ quay lại chế độ 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 hữu ích chủ yếu để phát video hoặc các trường hợp khác cần toàn bộ màn hình nhưng hoạt động đầu vào của người dùng là không bắt buộc.

Bạn có thể đặt 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 của bạn. Chiến lược phát hành đĩa đơn trình quản lý cửa sổ kết hợp (HOẶC cùng nhau) tất cả cờ từ tất cả các chế độ xem trong cửa sổ của bạn và áp dụng chúng 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ổ của bạn mất tiêu điểm đầu vào (người dùng rời khỏi ứng dụng hoặc một hộp thoại xuất hiện), cờ của bạn sẽ không còn hiệu lực. Tương tự, nếu bạn xoá các thành phần hiển thị đó khỏi hệ phân cấp thành phần hiển thị, thì cờ của các thành phần hiển thị đó 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.

Hãy xem 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 hỗ trợ thêm các sự kiện di chuột, sự kiện bút cảm ứng và sự kiện nút chuột mới.

Sự kiện di chuột

Lớp View hiện hỗ trợ các sự kiện "di chuột" để cho phép tương tác phong phú hơn thông qua việc sử dụng các thiết bị 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à hãy đăng ký tài khoản đó với setOnHoverListener(). Khi 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 sẽ trả về giá trị true từ onHover() nếu xử lý sự kiện di chuột. Nếu trình nghe trả về giá trị false, sau đó 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 sử dụng các nút hoặc tiện ích khác thay đổi giao diện của chúng dựa trên trạng thái hiện tại, bạn hiện có thể sử 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 nền khác có thể vẽ 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 Hover trong ApiDemos.

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

Android hiện cung cấp các API để nhận dữ liệu đầu vào từ thiết bị đầu vào bút cảm ứng, chẳng hạn như thiết bị ngoại vi 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 nhập bằng chuột. Khi bút cảm ứng đang tiếp xúc với bộ số hoá, ứng dụng sẽ nhận các sự kiện chạm giống như khi dùng ngón tay để chạm vào màn hình. Khi bút cảm ứng di chuột lên phía trên bộ số hoá, các ứng dụng sẽ nhận được thao tác di chuột các sự kiện tương tự như khi con trỏ chuột được di chuyển trên màn hình khi không có nút nào được nhấn.

Ứng dụng của bạn có thể phân biệt phương thức nhập bằng ngón tay, chuột, bút cảm ứng và công cụ xoá bằng cách truy vấn phương thức nhập "loại công cụ" được liên kết với mỗi 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 khác với phương thức nhập bằng ngón tay hoặc chuột.

Ứng dụng của bạn cũng có thể truy vấn nút chuột hoặc bút cảm ứng nào được nhấn bằng cách truy vấn "trạng thái nút" của MotionEvent bằng 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 quay lại và chuyển tiếp 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ợ thao tác di chuyển tới và lui dựa trên nút chuột.

Ngoài việc đo lường 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ũng báo cáo khoảng cách giữa đầu bút cảm ứng và bộ chuyển đổi số, góc nghiêng bút cảm ứng và góc hướng 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ạ 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. Lớp này cũng cho phép chức năng truyền xung quanh các tham chiếu trường/phương thức và cho phép mã đặt/lấy giá trị của thuộc tính mà không cần biết 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ẽ làm như sau:

Kotlin

foo.bar = value

Java

foo.bar = value;

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

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

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

Khi 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 thực thể 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 các trường khác nhau, chẳng hạn như các thuộc tính biến đổi đã được thêm vào trong Android 3.0 (ROTATION, ROTATION_X, TRANSLATION_X, v.v.).

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

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 giúp ảnh động mượt mà hơn, khả năng 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ương tác của người dùng tốt hơn.

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 hardwareAccelerated cho các phần tử <activity> riêng lẻ hoặc <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 danh sách các thao tác vẽ không được hỗ trợ, hãy xem tài liệu Tăng tốc phần cứng.

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à tay điều khiển 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ư nó hoạt động vì cho phép viết mã có lỗi. Trong Android 4.0, hệ thống hiện sử dụng tham chiếu gián tiếp để phát hiện các lỗi này.

Mọi chi tiết về tham chiếu cục bộ của JNI được mô tả trong phần "Tham chiếu cục bộ và toàn cầu" trong phần Mẹo về JNI. Trong Android 4.0, CheckJNI đã được cải tiến để phát hiện những lỗi này. Hãy theo dõi Blog dành cho nhà phát triển Android để biết bài đăng sắp tới về các lỗi thường gặp với 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 những ứng dụng nhắm đến Android 4.0 bằng cách đặt một trong hai targetSdkVersion hoặc minSdkVersion thành “14" trở lên. Nếu bạn đặt các thuộc tính này ở bất kỳ giá trị nào thấp hơn, thì các tham chiếu cục bộ JNI sẽ hoạt động giống như trong các phiên bản trước.

Phím Web

  • Cập nhật WebKit lên phiên bản 534.30
  • Hỗ trợ phông chữ Ấn Độ (Devanagari, Bengali và Tamil, bao gồm 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
  • Hỗ trợ cho WebDriver giúp giúp bạn dễ dàng thử nghiệm 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 sử dụng Wi-Fi để giao tiếp ngang hàng.

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

API trước

Ngoài mọi tính năng ở trên, Android 4.0 tự nhiên hỗ trợ tất cả các API từ các bản phát hành trước. 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 không biết tất cả các API được thêm vào Android trong các bản phát hành gần đây.

Dưới đây là một số API đáng chú ý nhất mà bạn có thể đã bỏ lỡ và hiện cũng có 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 thành phần 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 của riêng chúng. Xem Hướng dẫn cho nhà phát triển về Mảnh.
  • ActionBar: Thay thế thanh tiêu đề truyền thống ở đầu cửa sổ hoạt động. Trình đơn này bao gồm biểu trưng ứng dụng ở góc 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 dành cho nhà phát triển về Action Bar (Thanh thao tác).
  • Loader: Thành phần khung hỗ trợ tính không đồng bộ tải dữ liệu 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 về 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 (ngoài văn bản đơn thuần) vào và chuyển đi bảng nhớ tạm trên toàn hệ thống. Dữ liệu được cắt bớt có thể ở dạng văn bản thuần tuý, URI hoặc ý định. Xem Hướng dẫn cho nhà phát triển về Sao chép và dán.
  • Kéo và thả: Một nhóm API được tích hợp trong khung khung hiển thị để hỗ trợ thao tác kéo và thả các toán tử. Xem Hướng dẫn cho nhà phát triển về tính năng 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 tuỳ ý cho các thuộc tính của bất kỳ đối tượng (Xem, đối tượng 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, chẳng hạn như như thời lượng, nội suy, lặp lại, v.v. Khung mới tạo Ảnh động trong Android đơn giản hơn bao giờ hết. Xem Nhà phát triển Ảnh động thuộc tính của chúng tôi.
  • Công cụ điện toán và đồ hoạ RenderScript: RenderScript mang đến hình ảnh 3D hiệu suất cao API kết xuất đồ hoạ và tính toán ở cấp độ gốc mà bạn viết trong mã C (tiêu chuẩn C99), cung cấp loại hiệu suất bạn mong đợi từ môi trường gốc trong khi vẫn có tính năng di động trên nhiều CPU và GPU. Xem Nhà phát triển RenderScript của chúng tôi.
  • Đồ 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 bạn bằng cách đặt {android:hardwareAccelerated="true"} trong <application> của phần tử tệp kê khai của bạn hoặc cho từng phần tử <activity> phần tử. Kết quả này hoạt ảnh mượt mà hơn, cuộn mượt mà hơn và hiệu suất tổng thể cũng như phản hồi tốt hơn cho 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, tăng tốc phần cứng được bật theo mặc định.

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

Để sử 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 nền tảng Android hỗ trợ API cấp 14 hoặc cao hơ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" cho <uses-sdk> .

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