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 các 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 các nhà phát triển, nền tảng Android 4.0 được cung cấp dưới dạng 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 thử nghiệm trên Android 4.0, 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 bao gồm 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ơ. Việc đọc hồ sơ người dùng là một quyền nhạy cảm và bạn nên mong đợi người dùng hoài nghi về các ứng dụng yêu cầu quyền đó.

Ý đị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 ứng dụng dùng để mời người liên hệ đã chỉ định truy cập vào 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.

Để hiển thị ứng dụng của bạn như trong phần "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. 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. Hoạt động bắt đầu khi đó có thể truy xuất URI cho địa chỉ liên hệ được đề cập từ 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 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 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 địa chỉ liên hệ bằng cách đặt ảnh lớn trong cột PHOTO thông thường của hàng dữ liệu mà sau đó hệ thống sẽ xử lý thành hình thu nhỏ và ảnh hiển thị thích hợp bản ghi.

Ý kiến 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 địa chỉ liên hệ được liên kết với mỗi 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à 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ể sử 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 Bộ điều hợp đồng bộ hoá Lịch Google, cho phép xem các sự kiện này bằng ứng dụng Lịch Google.

Mô hình dữ liệu cho lịch và thông tin liên quan đến sự kiện trong Nhà cung cấp lịch là 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 các lớp con khác nhau của CalendarContract xác định:

  • Bảng CalendarContract.Calendars chứa thông tin dành riêng cho từng lịch của bạn. 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 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à 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à thời gian kết thúc của 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 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 đượ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 người tham dự sự kiện hoặc khách của bạn. Mỗi hàng đại diện cho một khách duy nhất của sự kiện. Mã này xác định kiểu khách mà và phản hồi của người đó đối với sự kiện.
  • Bảng CalendarContract.Reminders chứa 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 duy nhất 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. Lời nhắc được chỉ định theo số phút trước khi sự kiện diễn ra đã lên lịch và chỉ định một 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 nhở 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

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 duy nhất. 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ả các thư thoại, mỗi ứng dụng cung cấp thư thoại có thể đọc các thư thoại mà ứng dụng đó đã thêm vào hệ thống (nhưng không thể đọc đọ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, các ứ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 bảng mà trong đó ứ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 cung cấp thư thoại, hãy xem Nhà cung cấp thư thoại Bản minh hoạ.

Đ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 đa phương tiệ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.

Để 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 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 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 thành phần 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 đa phương tiện mà bạn có thể áp dụng 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 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à với một cấp mipmap (0), sẽ có cùng làm dữ liệu đầu vào.

Tất cả hiệu ứng nêu trong EffectFactory đều được đảm bảo sẽ đượ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 tính năng phát điều khiển từ ứ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ư đườ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 tường minh trong ứng dụng xử lý sự kiện ACTION_MEDIA_BUTTON.

Để khai báo đầu vào đ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 thực thể cho RemoteControlClient sẽ nhận được ACTION_MEDIA_BUTTON các sự kiện khi người dùng nhấn một nút trên điều khiển từ xa. Ý định bạn nhận được bao gồm KeyEvent cho phím nội dung nghe nhì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 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 thẻ được trả về RemoteControlClient.MetadataEditor 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ố như thời gian đã trôi qua và thông tin dạng văn bản như tiêu đề bản nhạc. Cho 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 tiêu đề HTTP bổ sung cùng với yêu cầu của bạn. Đ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 camera, hệ thống sẽ thực hiện lệnh gọi lại onFaceDetection() trong triển khai Camera.FaceDetectionListener, bao gồm một mảng Đố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
  • Số nguyên từ 1 đến 100 cho biết hệ thống có thể tin tưở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ị thiết bị, do đó bạn nên kiểm tra bằng cách gọi getMaxNumDetectedFaces() và đảm bảo 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ẽ là 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 dùng để lấy nét và đo sáng trắng số dư và phơi sáng tự động. Cả hai tính năng đều sử dụng lớp Camera.Area mới để chỉ định khu vực cần lấy tiêu điểm hoặc đo lượng dữ liệu trong chế độ xem hiện tại của camera. 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 getMaxNumFocusAreas() hoặc getMaxNumMeteringAreas() tương ứng. Nếu các giá trị này trả về 0, thì 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 đường dẫn lấy List đố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 của bản xem trước. Sau đó, bạn sẽ dịch sang đố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 đã sẵn sàng chụp một ả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 tiêu điểm. Để tiếp tục quá trình 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

  • Trong khi quay video, bạn hiện có thể gọi takePicture() để lưu ảnh mà không làm gián đoạn phiên xem 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 chặ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 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 gọi lệnh này truyền tin 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 phát ý đị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.

Truyền tia Android (Đẩy NDEF có NFC)

Truyền tia Android là tính năng NFC mới cho phép bạn gửi thông báo NDEF từ một thiết bị đến một quy trình khác (quy trình này còn được gọi là "Đẩy NDEF"). 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 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 Liên hệ 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 mà bạn muốn chia sẻ khi hoạt động của bạn hiển thị nền trước. Sau đó, bạn phải truyền NdefMessage đến hệ thống ở một trong hai cách:

  • 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 đó phương thức triển khai createNdefMessage() phương thức trả về NdefMessage 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 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 ở 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 Android Beam bắt đầu, trong trường hợp nội dung của thông báo có thể thay đổi trong suốt thời gian hoạt động.

Trong trường hợp bạn muốn chạy một mã cụ thể nào đó sau khi hệ thống đã phân phối thành công NDEF thông báo đến thiết bị khác, bạn có thể triển khai NfcAdapter.OnNdefPushCompleteCallback và thiết lập 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 gửi thông báo Đẩy NDEF theo cách tương tự như NFC thông thường các thẻ. Hệ thống gọi một ý định bằng ACTION_NDEF_DISCOVERED thao tác để 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 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, hãy xem hướng dẫn cho nhà phát triển về NFC.

Nếu muốn NdefMessage của mình chứa URI, giờ đây bạn có thể sử dụng tính năng tiện lợi phương thức 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 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ị kia nhận được thông báo NDEF bằ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 luôn gửi thông báo đến hoạt động trong ứng dụng của bạn (dựa trên tiêu chí so khớp bản ghi ứng dụng). Nếu thiết bị đích hiện chưa cài đặt ứng dụng của bạn, hệ thống sử dụng bản ghi ứng dụng Android để khởi chạy Google Play và đưa người dùng đến để cài đặt nó.

Nếu ứng dụng của bạn không sử 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 của bạn chạy ở nền trước trên một thiết bị và tính năng Truyền tia Android được gọi bằng một thiết bị khác chạy Android, sau đó thiết bị kia nhận được thông báo NDEF bằng 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ó ứng dụng được cài đặt, hệ thống sẽ khởi chạy ứng dụng đó; nếu bạn không cài đặt ứng dụng này, Google Play sẽ mở và nhận 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 dành cho nhà phát triển Kiến thức cơ bản về NFC. Đối với một số mã ví dụ bằng Android Beam, hãy xem phần Android Bản minh hoạ về tính năng chiếu tia.

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.

Gói android.net.wifi.p2p mới chứa tất cả API để thực hiện giao dịch ngang hàng kết nối Wi-Fi. Lớp chính bạn cần xử lý là WifiP2pManager mà bạn có thể lấ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 hay 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 được Internet, giao tiếp với Wi-Fi P2P ngang hàng bằng ổ cắm java tiêu chuẩn cần có Internet quyền).

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 Bản minh hoạ P2P Wi-Fi ứng dụng mẫu.

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ư các thiết bị có cấu hình A2DP và tai nghe thông thường, bạn phải gọi getProfileProxy() bằng BluetoothProfile.ServiceListener và loại cấu hình HEALTH để thiết lập kết nối với cấu hình proxy.

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 có sẵn 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 Cấu hình tình trạng 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

Người dùng bị suy giảm thị lực giờ đây 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 để nghe mô tả nội dung 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().

    Các cách triển khai tuỳ chỉnh của View có thể cầ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 mẹ để cung cấp thông tin mặc định như thông tin mô tả nội dung chuẩn, chỉ mục mặt hàng, v.v. 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 nhiều loại sự kiện cần được điền bằng văn bản thì khung hiển thị sẽ nhận được một lệnh gọi đến dispatchPopulateAccessibilityEvent() tuân theo 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() vào chế độ xem của cha mẹ. Sau đó, mỗi khung 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 đang thêm một AccessibilityRecord cho đến khi cuối cùng sẽ đi đến chế độ xem gốc. Thao tác này sẽ gửi sự kiện đến AccessibilityManager bằng sendAccessibilityEvent().

Ngoài các phương thức mới hữu ích ở 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 View bất kỳ bằng cách mở rộng AccessibilityDelegate và đặt phương thức đó 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 khung hiển thị sẽ trì hoãn lệnh gọi đến phương thức tương ứng trong người được uỷ quyền. Ví dụ: khi nhận được một lệnh gọi đến onPopulateAccessibilityEvent(), thành phần hiển thị đó sẽ chuyển lệnh gọi đến hàm cùng một phương thức trong View.AccessibilityDelegate. Bất kỳ phương thức nào không được xử lý thì uỷ quyền sẽ được đưa trở lại khung hiển thị mặc định. Thao tác này chỉ cho phép bạn ghi đè các phương thức cần thiết cho bất kỳ khung hiển thị nhất định nào mà không cần mở rộng lớp View.

Nếu bạn 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ợ API hỗ trợ tiếp cận mới, bạn có thể làm như vậy bằng phiên bản mới nhất của hỗ trợ phiên bản 4 thư viện (trong Compatibility Package, r4) 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 theo khả năng tương thích ngược thiết kế của bạn.

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ông tin về các sự kiện hỗ trợ tiếp cận đã được mở rộng đáng kể để cho phép người dùng cung cấp thêm thông tin phản hồi nâng cao về khả năng hỗ trợ tiếp cận. Trong Cụ thể, các sự kiện được tạo dựa trên thành phần của khung hiển thị, cung cấp thông tin ngữ cảnh rõ ràng hơn và cho phép các dịch vụ hỗ trợ tiếp cận truyền tải hệ phân cấp khung hiển thị để có thêm thông tin về khung hiển thị và giải quyết 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 thông tin bổ sung về nội dung và hệ phân cấp khung hiển thị chuyển tải 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ội dung đó 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 phiên bản trước của sự kiện 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ả

Mộ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 phương thức gọi lại SpellCheckerService.Session, bạn phải trả về giá trị gợi ý 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 dễ dàng triển khai các công cụ TTS tùy chỉnh, trong khi các ứng dụng muốn sử dụng công cụ TTS có một vài API mới để chọn một 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 đây, bạn có thể 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ụ tùy chỉnh bằng cách sử dụng setEngineByPackageName(). Trong Android 4.0, phương thức setEngineByPackageName() đã được không dùng nữa và giờ đây, bạn có thể chỉ định công cụ để sử dụng với một 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 . 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 bạn 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 phương thức này đối tượng:

  • SynthesisRequest: Tệp này chứa nhiều dữ liệu, bao gồm cả văn bả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 của bạn sử dụng 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 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 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.

Để tìm hiểu về công cụ TTS mẫu sử dụng các API mới, hãy xem ứng dụng mẫu Text To Speech Engine (Công cụ chuyển văn bản sang lời nói).

Mức sử dụng mạng

Android 4.0 cho phép người dùng hiển thị chính xác lượng dữ liệu mạng mà các ứ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 bạn dùng bất kỳ mạng nào giao dịch, bạn nên 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. 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 hoặc đã kết nối với Wi-Fi.

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 một dịch vụ VPN, hãy dùng VpnService.Builder để có thể chỉ định địa chỉ mạng, máy chủ DNS, định tuyến mạng, v.v. Sau khi hoàn tất, bạn có thể thiết lập bằng cách gọi establish() (trả về ParcelFileDescriptor).

Do dịch vụ VPN có thể chặn các gói nên sẽ có những vấn đề về bảo mật. Như vậy, 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 thành phần đó (chỉ hệ thống sẽ được cấp quyền này – ứng dụng không thể yêu cầu quyền đó). 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, ba cảm biến tổng hợp của Android đã được cải tiến đáng kể để giờ đây chúng có độ trễ 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 hành động

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ó thể chọn sử dụng "thanh hành động chia tách" Thao tác này sẽ đặt tất cả các mục hành động vào một thanh riêng biệt ở dưới cùng khi màn hình bị thu 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, do đó 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 hành động chia tách" để nhiều mục hành động khác có thể xuất hiện trên màn hình trong thanh riêng biệt ở 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 hiển thị tất cả các mục hành động khi màn hình bị thu hẹp (không có mục hành động nào xuất hiện trong thanh tác vụ).

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 lại gì trong thanh tác vụ chính, biến mất—tất cả những gì chỉ 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 nền có thể vẽ hoặc màu vào thanh xếp chồng và thanh phân tách. 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. Trình cung cấp thao tác có thể xác định chế độ xem thao tác, hành vi mặc định của thao tác và trình đơn phụ cho từng mục hành động 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à phần mở rộng của ActionProvider để hỗ trợ một "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 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 chế độ xem 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 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 onCreateOptionsMenu() của hoạt động phương thức gọi lại, hãy truy xuất bản sao của trình cung cấp thao tác 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);
}

Để 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 khung hiển thị hành động chuyển đổi giữa chế độ xem mở rộng và thu gọn, hãy đăng ký 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 làm như vậ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 một 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ề 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 trên 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 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 hình chữ nhật lưới. Không giống như TableLayout, GridLayout dựa trên và không sử dụng khung hiển thị trung gian, chẳng hạn như hàng trong bảng để cung cấp cấu trúc. Thay vào đó, thành phần con 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 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 cách giữa các phần tử con bằng cách sử dụng thực thể của chế độ xem Space mới hoặc bằng cách đặt các tham số lề có liên quan đối với trẻ em.

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

Chế độ xem kết cấu

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 ở chỗ nó hoạt động giống như khung hiển thị thông thường, thay vì tạo một riêng một cửa sổ để bạn có thể xử lý cửa sổ này 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 ra mắt PopupMenu để tạo các trình đơn ngắn theo ngữ cảnh bật lên tại điểm neo bạn chỉ định (thường là tại điểm của mục được chọn). Mở rộng Android 4.0 PopupMenu với một vài 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 chế độ cài đặt Bluetooth và Wi-Fi.

Giao diện hệ thống

Giao diện mặc định cho tất cả các ứng dụng nhắm đến Android 4.0 (bằng cách đặt targetSdkVersion hoặc minSdkVersion đến “14" trở lên) hiện là "chế độ mặc định của thiết bị" chủ đề: Theme.DeviceDefault. Thông tin này có thể là chủ đề Holo tối hoặc chủ đề 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 phiên bản Android cũ hơn.

Để 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 để 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à trạng thái thanh nằm ở đầu thiết bị cầm tay để cung cấp thông tin như nhà mạng tín hiệu, thời gian, thông báo, v.v. Android 3.0 đã thêm thanh hệ thống cho máy tính bảng các thiết bị nằm ở cuối màn hình để cung cấp các công cụ điều khiển điều hướng của hệ thống (Màn hình chính, Quay lại, v.v.) và giao diện cho các phần tử được thanh trạng thái cung cấp theo cách truyền thống. Trong 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à một phiên bản được tinh chỉnh lại của thanh hệ thống được thiết kế để điện thoại di động—cung cấp các công cụ điều khiển điều hướng đối với các thiết bị không có phiên bản phần cứng tương tự để đ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 chế độ kiểm soát cài đặt. 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 bị làm mờ và các phần tử khác trên thanh hệ thống cũng bị ẩ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 sẽ ẩ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 dữ liệu đầu vào tiêu điểm (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ẽ ngừng có hiệu lực. 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ị, các cờ của khung 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 bằng các thay đổi về chế độ hiển thị đối với giao diện người dùng hệ thống (đối với ví dụ: ẩn thanh thao tác hoặc các thành phần điều khiển khác trên giao diện người dùng khi giao diện người dùng hệ thống ẩn), bạn nên đăng ký View.OnSystemUiVisibilityChangeListener sẽ nhận đượ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 bổ sung tính năng hỗ trợ các sự kiện di chuột bằng bút cảm ứng cũng như các sự kiện nút chuột và bút cảm ứng mới.

Sự kiện di chuột

Lớp View hiện hỗ trợ tính năng "di chuột" sự kiện để cho phép tương tác phong phú hơn thông qua việc sử dụng 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 màn hình) con trỏ).

Để 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ạ các sự kiện di chuột mới, hãy xem lớp Di chuột trong API Apidemo.

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 qua thiết bị đầu vào bằng bút cảm ứng, chẳng hạn như bộ số hoá thiết bị ngoại vi của máy tính bảng 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 theo cách tương tự như nhập bằng cách chạm hoặc 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 nhau, từ 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 xem người dùng nhấn nút nào trên chuột hoặc trên bút cảm ứng bằng cách truy vấn nút "button trạng thái" 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 quay lại và tiến trên chuột tự động được liên kết với khoá KEYCODE_BACKKEYCODE_FORWARD. Ứng dụng của bạn có thể xử lý các khoá này để hỗ trợ nút chuột dựa trên điều hướng tiến và lùi.

Ngoài việc đo chính xác vị trí và áp lực của điểm tiếp xúc, một số phương thức nhập bằng bút cảm ứng thiết bị cũng 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 bản minh hoạ các loại công cụ, trạng thái nút và mã trục mới, hãy xem phần 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 trên bất kỳ đối tượng nào cho phép phương thức gọi đặt/nhận giá trị trên các đối tượng mục tiêu nói chung. Điều này cũng cho phép chức năng truyền xung quanh các nội dung 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 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, bạn nên trước đây sẽ làm điều này:

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 đó bạn 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 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.

Bạn có thể khai báo Property bằng cách sử dụng lớp Property đối tượng BAR trên lớp Foo để bạn 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

Bắt đầu từ Android 4.0, tăng tốc phần cứng cho tất cả các cửa sổ được bật theo mặc định nếu ứng dụng đã đặt targetSdkVersion hoặc minSdkVersion đến “14" trở lên. Tăng tốc phần cứng thường đem lại ảnh động và hình ảnh mượt mà hơn và hiệu suất tổng thể cũng như 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ề cách tăng tốc phần cứng, bao gồm cả danh sách các bản vẽ không được hỗ trợ thao tác, hãy xem phần Phần cứng Tài liệu về Accelerated (Tăng tốc).

Thay đổi về JNI

Trong các phiên bản Android trước đây, tệp tham chiếu cục bộ JNI không phải là tên người dùng gián tiếp; Sử dụng Android 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 đối tượng mà có vẻ hiệu quả vì nó cho phép viết mã 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 thiện để 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 bài đăng sắp tới về các lỗi thường gặp khi 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 thành bất kỳ giá trị thấp hơn nào, 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.

WebKit

  • WebKit được cập nhật 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ỉ có sẵn cho các thiết bị màn hình lớn, nếu bạn đã đang phát triển chủ yếu cho điện thoại di động, thì bạn có thể 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.

Sau đây là một số API đáng chú ý nhất mà bạn có thể đã bỏ lỡ mà hiện đã 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ế cho thanh tiêu đề truyền thống ở đầu cửa sổ hoạt động. Nó bao gồm biểu trưng ứng dụng ở góc bên trái và cung cấp cho các mục trong trình đơn. Xem Hướng dẫn cho nhà phát triển về 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 thiết bị ngoại vi được 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 tính năng hỗ trợ cho cả cá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 về Máy chủ 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 android.mtp.
  • RTP API: Android hiển thị 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ể dùng để quản lý luồng dữ liệu theo yêu cầu hoặc luồng dữ liệu 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 android.net.rtp.
  • Hỗ trợ cần điều khiển và các đầu vào chuyển động chung khác.
  • Xem Nền tảng Android 3.1 ghi chú cho nhiều API mới hơn.
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 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 các đơn vị pixel không phụ thuộc vào mật độ (chẳng hạn như rộng 600dp hoặc 720dp), thay vì theo đơn vị pixel tổng quát kích thước màn hình (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 hãy phân biệt "5" và màn hình 7 inch cả hai, thường được nhóm dưới dạng "lớn" màn hình. 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 từ <uses-feature> đến khai báo các yêu cầu về hướng màn hình ngang hoặc dọc.
  • "Kích thước màn hình" của thiết bị cấu hình hiện thay đổi theo 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, 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.
  • Xem Nền tảng Android 3.2 cho các API mới khác.

Cấp độ API:

API Android 4.0 được gán một số nguyên mã nhận dạng – 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 bạn, 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 API là gì Cấp độ?