TalkBack là trình đọc màn hình tích hợp của Google dành cho Android, một phần của gói Android Accessibility Suite. Nó đọc to các thành phần giao diện và cho phép điều khiển thiết bị bằng cử chỉ, mang lại cho người dùng khiếm thị và mù quyền truy cập đầy đủ vào các chức năng của điện thoại thông minh. Theo Google Accessibility Help (2025), TalkBack được cài đặt sẵn trên hầu hết các thiết bị Android và hỗ trợ hơn 30 ngôn ngữ với nhiều công cụ giọng nói khác nhau.
Những điểm chính
TalkBack là trình đọc màn hình dành cho Android, do Google phát triển và là một phần của Android Accessibility Suite. Nó cung cấp phản hồi bằng giọng nói và điều khiển bằng cử chỉ cho người dùng khiếm thị. TalkBack hoạt động trên điện thoại thông minh, máy tính bảng, Smart TV và các thiết bị đeo chạy Wear OS.
TalkBack xuất hiện lần đầu tiên trong Android 1.6 (Donut) vào năm 2009. Ban đầu đó là một dự án riêng, nhưng với sự ra mắt của Android 4.0 (Ice Cream Sandwich), nó đã trở thành một phần của Android Accessibility Suite — một tập hợp các dịch vụ bao gồm Switch Access và Select to Speak. Bắt đầu từ Android 10, TalkBack được cài đặt sẵn trên tất cả các thiết bị có dịch vụ Google Play, bao gồm cả thiết bị đối tác — Samsung, Xiaomi, Oppo và các hãng khác.
TalkBack hỗ trợ hơn 30 ngôn ngữ với nhiều công cụ giọng nói khác nhau: Google Text-to-Speech, Samsung TTS và các công cụ bên thứ ba. Đối với tiếng Việt, Google TTS cung cấp phát âm tự nhiên và ngữ điệu chính xác. Người dùng có thể điều chỉnh tốc độ nói, cao độ và chọn giọng nói theo giới tính trong cài đặt TalkBack.
TalkBack hoạt động dựa trên AccessibilityService — một cơ chế hệ thống trong Android cho phép các ứng dụng nhận thông tin về trạng thái giao diện và tương tác với nó bằng lệnh. Khi TalkBack được bật, nó chặn tất cả các sự kiện chạm và biến chúng thành cử chỉ đọc màn hình đặc biệt.
Yếu tố chính trong hoạt động của TalkBack là tiêu điểm trợ năng. Khác với tiêu điểm đầu vào tiêu chuẩn, xuất hiện dưới dạng làm nổi bật trường văn bản, tiêu điểm trợ năng được hiển thị dưới dạng khung màu vàng xung quanh thành phần và vô hình đối với người dùng không có TalkBack. Khi tiêu điểm trợ năng đến một thành phần, TalkBack sẽ đọc to nội dung, loại và trạng thái của nó.
Người dùng di chuyển tiêu điểm trợ năng bằng cử chỉ: vuốt sang phải — thành phần tiếp theo, vuốt sang trái — thành phần trước đó. Các thành phần được duyệt theo thứ tự do AccessibilityNodeInfo xác định — cây trợ năng mà Android xây dựng cho mỗi màn hình. Nhà phát triển có thể ảnh hưởng đến thứ tự thông qua các thuộc tính accessibilityTraversalBefore và accessibilityTraversalAfter, điều này đặc biệt quan trọng đối với các màn hình phức tạp với bố cục tùy chỉnh.
Mỗi View trên màn hình được đại diện bởi một nút trong cây trợ năng — một đối tượng AccessibilityNodeInfo. Đối tượng này chứa: văn bản của thành phần (contentDescription hoặc văn bản view), loại thành phần (nút, hộp kiểm, trường nhập), trạng thái (đã bật/đã tắt/đã chọn), vị trí trên màn hình và danh sách các hành động có sẵn. TalkBack duyệt cây này và đọc to từng nút theo thứ tự duyệt.
Nếu một View không có nội dung văn bản (ví dụ: ImageView không có mô tả), nó sẽ trở nên vô hình đối với TalkBack — người dùng sẽ không biết về sự tồn tại của nó. Để giải quyết vấn đề này, nhà phát triển đặt contentDescription — một mô tả văn bản mà TalkBack đọc thay vì im lặng. Android cũng hỗ trợ stateDescription cho các thành phần có trạng thái thay đổi (đã chọn/chưa chọn) và hintText cho các trường nhập có gợi ý.
TalkBack biến các cử chỉ Android tiêu chuẩn thành cử chỉ đọc màn hình đặc biệt. Hầu hết các thao tác được thực hiện bằng một hoặc hai ngón tay, trong khi cử chỉ ba ngón tay dành cho các hành động toàn cục.
| Hành động | Cử chỉ | Kết quả |
|---|---|---|
| Đọc to thành phần | Chạm một lần | Đọc tên và loại thành phần |
| Kích hoạt | Chạm hai lần | Nhấn nút hoặc điều hướng |
| Tiếp theo | Vuốt sang phải | Thành phần tiếp theo |
| Trước đó | Vuốt sang trái | Thành phần trước đó |
| Cuộn | Vuốt 2 ngón tay | Cuộn danh sách |
| Trình đơn TalkBack | Vuốt lên-trái | Trình đơn cài đặt toàn cục |
Cử chỉ vuốt lên-trái (vuốt hình chữ L) mở trình đơn TalkBack toàn cục, nơi người dùng có thể thay đổi tốc độ nói, bật màn hình tối, khởi chạy hướng dẫn hoặc mở cài đặt. TalkBack cũng hỗ trợ trình đơn ngữ cảnh cho các thành phần: vuốt lên-phải mở danh sách các hành động có sẵn cho thành phần hiện tại (ví dụ: “Sao chép”, “Dán” cho trường văn bản hoặc “Xóa” cho tin nhắn trò chuyện).
Android cung cấp một API phong phú để cấu hình trợ năng. Cấp cơ bản là contentDescription, nhưng để hỗ trợ TalkBack chất lượng, cần làm việc với AccessibilityNodeInfo, AccessibilityDelegate và LiveRegion.
Thuộc tính android:contentDescription xác định mô tả văn bản của thành phần cho TalkBack. Nó bắt buộc đối với ImageView, ImageButton, FloatingActionButton và bất kỳ View tùy chỉnh nào không có nội dung văn bản. Đối với các thành phần tiêu chuẩn (TextView, Button), contentDescription là tùy chọn — TalkBack sẽ tự động đọc văn bản.
val avatarView = ImageView(this)
avatarView.contentDescription = "Hình đại diện người dùng"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "Phát video"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
Cờ importantForAccessibility kiểm soát khả năng hiển thị của thành phần đối với TalkBack. Giá trị NO ẩn thành phần khỏi cây trợ năng — hữu ích cho hình ảnh trang trí, chỉ báo và nền tùy chỉnh. Giá trị YES buộc thành phần phải có trong quá trình duyệt ngay cả khi không có văn bản. Điều quan trọng là không lạm dụng NO: ẩn các thành phần quan trọng về mặt ngữ nghĩa sẽ khiến ứng dụng không thể truy cập được đối với người dùng TalkBack.
Đối với các View tùy chỉnh không sử dụng trình xử lý nhấp chuột tiêu chuẩn, cần ghi đè AccessibilityDelegate — một lớp xử lý các sự kiện trợ năng. Ủy quyền cho phép xác định mô tả tùy chỉnh, loại thành phần và danh sách các hành động có sẵn mà TalkBack sẽ cung cấp cho người dùng qua trình đơn ngữ cảnh.
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "Nút tùy chỉnh"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "Chia sẻ"
)
)
}
override fun performAccessibilityAction(
host: View, action: Int, args: Bundle?
): Boolean {
if (action == R.id.custom_action) {
shareContent()
return true
}
return super.performAccessibilityAction(host, action, args)
}
}
Trong ví dụ, ủy quyền thông báo cho TalkBack rằng thành phần là một nút (className = Button) và cung cấp một hành động tùy chỉnh “Chia sẻ” sẽ xuất hiện trong trình đơn ngữ cảnh của TalkBack. Phương thức performAccessibilityAction xử lý việc gọi hành động này. Nếu không có ủy quyền, TalkBack sẽ coi View tùy chỉnh như một khu vực không tương tác đơn giản và người dùng sẽ không thể tương tác với nó.
Hỗ trợ TalkBack đầy đủ không chỉ bao gồm contentDescription mà còn quản lý tiêu điểm, LiveRegion cho các cập nhật động, kiểm thử với trình đọc màn hình được bật và thích ứng cho các phiên bản Android khác nhau.
Khi nội dung màn hình thay đổi mà không có hành động rõ ràng của người dùng (ví dụ: thông báo tin nhắn mới xuất hiện hoặc bộ đếm lượt thích được cập nhật), TalkBack phải nhận được thông báo. Để làm điều này, sử dụng thuộc tính android:accessibilityLiveRegion cho View trong XML hoặc phương thức setAccessibilityLiveRegion() trong mã. Giá trị polite thêm thông báo sau khi kết thúc đọc hiện tại, trong khi assertive ngắt nó ngay lập tức.
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// Khi văn bản được cập nhật, TalkBack sẽ tự động
// thông báo thay đổi
statusText.text = "Tin nhắn mới từ Anna"
// Đối với thông báo quan trọng — assertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegion là tương đương Android của UIAccessibility.post trên iOS. Sử dụng polite cho hầu hết các cập nhật (tin nhắn mới, cập nhật trạng thái) và assertive chỉ cho các lỗi nghiêm trọng (thanh toán thất bại, mất kết nối). Sử dụng assertive quá mức tạo ra trải nghiệm người dùng tiêu cực — TalkBack sẽ liên tục ngắt đọc hiện tại.
Đối với các màn hình phức tạp nơi nhiều View tạo thành một đơn vị logic duy nhất, sử dụng AccessibilityNodeProvider hoặc focusSearch để ghi đè điều hướng. Ví dụ, một lịch tùy chỉnh có 42 ô (6 tuần × 7 ngày) không nên buộc người dùng phải cuộn qua tất cả 42 mục để đến khối tiếp theo. Nhà phát triển có thể nhóm các ô thành các đơn vị logic: tháng → tuần → ngày.
Đối với Jetpack Compose, bộ sửa đổi .semantics {} cung cấp một API tương tự: contentDescription, liveRegion, stateDescription, disabled và customActions. Compose cũng hỗ trợ mergeDescendants để hợp nhất các ngữ nghĩa con thành một, đơn giản hóa việc nhóm các thành phần mà không cần cấu hình accessibilityDelegate thủ công cho từng View.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("Gửi tin nhắn")
stateDescription("Sẵn sàng gửi")
}
) {
Icon(Icons.Filled.Send, "Gửi")
}
Kiểm thử TalkBack được thực hiện bằng thiết bị thật hoặc trình giả lập với dịch vụ được bật. Nên thực hiện các kịch bản người dùng chính với màn hình tắt (Screen Curtain) — điều này mô phỏng việc không có phản hồi trực quan. Android cũng cung cấp Accessibility Scanner — một công cụ phát hiện tự động các vấn đề trợ năng, làm nổi bật các thành phần không có contentDescription, vùng chạm quá nhỏ và độ tương phản thấp.
Câu hỏi thường gặp
Cài đặt → Trợ năng → TalkBack → Bật. Để bật nhanh, nhấn cả hai phím âm lượng cùng lúc trong 3 giây. Google Assistant cũng có thể bật TalkBack bằng lệnh thoại “Bật TalkBack”.
TalkBack là trình đọc màn hình cho Android, VoiceOver dành cho iOS. TalkBack sử dụng AccessibilityService và tiêu điểm trợ năng với khung màu vàng, trong khi VoiceOver sử dụng UIAccessibility và bộ quay. Cử chỉ và trình đơn khác nhau: TalkBack có cử chỉ vuốt hình chữ L cho trình đơn toàn cục.
Đặt contentDescription cho tất cả ImageView và các thành phần tùy chỉnh. Sử dụng importantForAccessibility để ẩn các thành phần trang trí. Cấu hình accessibilityLiveRegion cho các cập nhật động và kiểm tra bằng Accessibility Scanner. Trong Compose, sử dụng bộ sửa đổi .semantics{}.
Đó là một đối tượng đại diện cho một thành phần giao diện trong cây trợ năng. Nó chứa văn bản, loại, trạng thái, vị trí và danh sách hành động. TalkBack duyệt cây này để điều hướng. Nhà phát triển có thể sửa đổi nó thông qua AccessibilityDelegate hoặc thuộc tính XML.
Kiểm tra importantForAccessibility — có thể nó được đặt thành NO. Đảm bảo rằng contentDescription đã được đặt cho các thành phần không có văn bản. Đối với View tùy chỉnh, triển khai AccessibilityDelegate với onInitializeAccessibilityNodeInfo. Sử dụng Accessibility Scanner để chẩn đoán.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm