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 trongMAX_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:
Events.TITLE
: Tên của sự kiệnCalendarContract.EXTRA_EVENT_BEGIN_TIME
: Thời gian bắt đầu sự kiện tính bằng mili giây kể từ thời gian bắt đầu của hệ thốngCalendarContract.EXTRA_EVENT_END_TIME
: Sự kiện thời gian kết thúc tính bằng mili giây từ thời gian bắt đầu của hệ thốngEvents.EVENT_LOCATION
: Địa điểm diễn ra sự kiệnEvents.DESCRIPTION
: Sự kiện mô tảIntent.EXTRA_EMAIL
: Địa chỉ email của những người được gửi đến mờiEvents.RRULE
: Sự kiện lặp lại quy tắc cho sự kiệnEvents.ACCESS_LEVEL
: Sự kiện là riêng tư hay công khaiEvents.AVAILABILITY
: Liệu khoảng thời gian của sự kiện này có cho phép các sự kiện khác được lên lịch cùng lúc hay không
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.Voicemails
và VoicemailContract.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:
- 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
- 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à:
- Gọi
EffectContext.createWithCurrentGlContext()
từ ngữ cảnh OpenGL ES 2.0. - Sử dụng
EffectContext
được trả về để gọiEffectContext.getFactory()
(trả về một thực thể) trong tổng sốEffectFactory
. - 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ặcEFFECT_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_PREVIOUS
và FLAG_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ềnINTERNET
. Nếu bạn sử dụngMediaPlayer
để phát nội dung từ Internet, hãy nhớ thêmINTERNET
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 địnhSurface
để 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ọiisVideoSnapshotSupported()
để đả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()
và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àyNdefMessage
trongonCreate()
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ửiNdefMessage
đế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ứccreateNdefMessage()
sẽ trả vềNdefMessage
mà bạn muốn gửi. Sau đó, hãy truyền quá trình triển khaiNfcAdapter.CreateNdefMessageCallback
chosetNdefPushMessageCallback()
.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ấtNdefMessage
mà bạn muốn gửi. Điều này cho phép bạn xác địnhNdefMessage
để 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ấpWifiP2pDeviceList
mà từ đó bạn có thể truy xuất đối tượngWifiP2pDevice
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ượngWifiP2pGroup
. Đố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ượngWifiP2pInfo
, 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:
WIFI_P2P_CONNECTION_CHANGED_ACTION
: Trạng thái kết nối P2P đã thay đổi. Thao tác này sẽ chuyểnEXTRA_WIFI_P2P_INFO
bằng đối tượngWifiP2pInfo
vàEXTRA_NETWORK_INFO
bằng đối tượngNetworkInfo
.WIFI_P2P_STATE_CHANGED_ACTION
: Trạng thái P2P đã đã thay đổi giữa bật và tắt. Nó chứaEXTRA_WIFI_STATE
vớiWIFI_P2P_STATE_DISABLED
hoặcWIFI_P2P_STATE_ENABLED
WIFI_P2P_PEERS_CHANGED_ACTION
: Danh sách thiết bị ngang hàng đã thay đổi.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
: Thông tin chi tiết về thiết bị này đã thay đổi.
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 đếnBluetoothHealthCallback
, 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 APIBluetoothHealth
.
Để 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:contentDescription
và setContentDescription()
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:
- Khi được gọi, các phương thức
sendAccessibilityEvent()
vàsendAccessibilityEventUnchecked()
sẽ trì hoãn đếnonInitializeAccessibilityEvent()
.Bạn nên triển khai
onInitializeAccessibilityEvent()
để đính kèm thông tin hỗ trợ tiếp cận bổ sung vàoAccessibilityEvent
trong quá trình triển khai tuỳ chỉnhView
, 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. - 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ạionPopulateAccessibilityEvent()
.Các cách triển khai tuỳ chỉnh của
View
thường nên triển khaionPopulateAccessibilityEvent()
để bổ sung thêm nội dung văn bản vàoAccessibilityEvent
nếu văn bảnandroid:contentDescription
bị thiếu hoặc không đủ. Để thêm mô tả bằng văn bản khác vàoAccessibilityEvent
, gọigetText()
.add()
. - 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ọirequestSendAccessibilityEvent()
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êmAccessibilityRecord
, 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 đếnAccessibilityManager
bằngsendAccessibilityEvent()
.
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:
- Sau khi nhận được
AccessibilityEvent
từ một đơn đăng ký, gọiAccessibilityEvent.getRecord()
để truy xuất mộtAccessibilityRecord
cụ thể (có thể có một số bản ghi được đính kèm với sự kiện). - Từ
AccessibilityEvent
hoặc mộtAccessibilityRecord
riêng lẻ, bạn có thể gọigetSource()
để truy xuất đối tượngAccessibilityNodeInfo
.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ượngAccessibilityNodeInfo
đượ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. - Với
AccessibilityNodeInfo
, bạn có thể truy vấn thông tin về thực thể đó, hãy gọigetParent()
hoặcgetChild()
để 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 AccessibilityService
và SERVICE_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ư:
AccessibilityManager.AccessibilityStateChangeListener
là giao diện cho phép bạn nhận lệnh gọi lại bất cứ khi nào khả năng hỗ trợ tiếp cận được bật hoặc tắt.getEnabledAccessibilityServiceList()
cung cấp thông tin về những dịch vụ hỗ trợ tiếp cận hiện đang được bật.isTouchExplorationEnabled()
cho biết bạn có bật chế độ khám phá bằng cách chạm hay không.
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ọistart()
để cho biết công cụ đã sẵn sàng phân phối âm thanh, sau đó gọiaudioAvailable()
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ọidone()
.
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_TEMPERATURE
và TYPE_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 backgroundStacked
và backgroundSplit
để á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()
và 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()
và 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()
và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:textOn
và android: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.xml và Nút chuyển tương ứng hoạt động.
Trình đơn bật lên
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_STYLUS
và TOOL_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_BACK
và BUTTON_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_BACK
và KEYCODE_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_TILT
và AXIS_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:
- Cập nhật trình biên dịch JavaScript V8 để có hiệu suất nhanh hơn
- Ngoài ra, các tính năng nâng cao đáng chú ý khác được chuyển từ Android 3.0 hiện cũng có trên điện thoại di động:
- Hỗ trợ các phần tử vị trí cố định trên tất cả các trang
- Ghi lại nội dung nghe nhìn HTML
- Sự kiện hướng thiết bị
- Chuyển đổi CSS 3D
Quyền
Sau đây là các quyền mới:
ADD_VOICEMAIL
: Cho phép dịch vụ thư thoại thêm thư thoại tin nhắn đến thiết bị.BIND_TEXT_SERVICE
: Một dịch vụ triển khaiSpellCheckerService
phải yêu cầu quyền này cho chính nó.BIND_VPN_SERVICE
: Một dịch vụ triển khaiVpnService
phải yêu cầu quyền này cho chính nó.- android.Manifest.permission#READ_PROFILE: Cấp quyền đọc cho trình cung cấp
ContactsContract.Profile
. - android.Manifest.permission#write_PROFILE: Cấp quyền ghi cho trình cung cấp
ContactsContract.Profile
.
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ặctargetSdkVersion
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"
. Xemandroid: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ì?