TalkBack — صفحهخوان داخلی (screen reader) ساخته Google برای Android است که بخشی از بسته Android Accessibility Suite میباشد. این ابزار عناصر رابط کاربری را صداگذاری میکند و امکان کنترل دستگاه با استفاده از حرکات را فراهم میآورد و به کاربران نابینا و کمبینا دسترسی کامل به عملکردهای گوشی هوشمند میدهد. بر اساس Google Accessibility Help (2025)، TalkBack روی اکثر دستگاههای Android از پیش نصب شده است و بیش از ۳۰ زبان را با موتورهای مختلف صوتی پشتیبانی میکند.
نکات اصلی
TalkBack — یک صفحهخوان (screen reader) برای Android است که توسط Google توسعه یافته و بخشی از Android Accessibility Suite میباشد. این ابزار برای کاربران دارای مشکلات بینایی، بازخورد صوتی و کنترل حرکتی فراهم میکند. TalkBack میتواند هم روی گوشیهای هوشمند و هم روی تبلتها، تلویزیونهای هوشمند و دستگاههای پوشیدنی با Wear OS کار کند.
TalkBack اولین بار در Android 1.6 (Donut) در سال ۲۰۰۹ ظاهر شد. در ابتدا یک پروژه مجزا بود، اما با انتشار Android 4.0 (Ice Cream Sandwich) به بخشی از Android Accessibility Suite — مجموعه سرویسهایی که شامل Switch Access و Select to Speak نیز میشود — تبدیل شد. از Android 10 به بعد، TalkBack روی همه دستگاههای دارای سرویسهای Google Play از جمله دستگاههای شرکا — Samsung، Xiaomi، Oppo و دیگران — از پیش نصب شده است.
TalkBack بیش از ۳۰ زبان را با موتورهای مختلف صوتی پشتیبانی میکند: Google Text-to-Speech، Samsung TTS و موتورهای شخص ثالث. برای زبان فارسی از موتور صوتی Google TTS استفاده میشود که تلفظ طبیعی و آهنگ درست را فراهم میکند. کاربر میتواند سرعت گفتار، زیروبمی صدا را تنظیم کرده و جنسیت صدا را در تنظیمات TalkBack انتخاب کند.
TalkBack بر اساس سرویس دسترسی (AccessibilityService) کار میکند — مکانیزم سیستمی Android که به برنامهها اجازه میدهد اطلاعاتی درباره وضعیت رابط کاربری دریافت کرده و به صورت برنامهنویسی با آن تعامل داشته باشند. وقتی TalkBack فعال است، تمام رویدادهای لمسی را رهگیری کرده و آنها را به حرکات خاص صفحهخوان تبدیل میکند.
عنصر کلیدی کار TalkBack — فوکوس دسترسی (accessibility focus) است. برخلاف فوکوس ورودی استاندارد که به صورت برجستهسازی فیلد متنی دیده میشود، فوکوس دسترسی با یک قاب زرد دور عنصر نمایش داده میشود و برای کاربر بدون TalkBack نامرئی است. وقتی فوکوس دسترسی به عنصری میرسد، TalkBack محتوا، نوع و وضعیت آن را صداگذاری میکند.
کاربر فوکوس دسترسی را با حرکات جابجا میکند: کشیدن به راست — عنصر بعدی، کشیدن به چپ — عنصر قبلی. عناصر به ترتیب تعیینشده توسط AccessibilityNodeInfo — درخت دسترسی که Android برای هر صفحه میسازد — پیمایش میشوند. توسعهدهنده میتواند از طریق ویژگیهای accessibilityTraversalBefore و accessibilityTraversalAfter بر ترتیب تأثیر بگذارد که برای صفحات پیچیده با چیدمان سفارشی بسیار مهم است.
هر View روی صفحه با یک گره در درخت دسترسی — یک شیء AccessibilityNodeInfo — نمایش داده میشود. این شیء شامل: متن عنصر (contentDescription یا متن View)، نوع عنصر (دکمه، چکباکس، فیلد ورودی)، وضعیت (فعال/غیرفعال/انتخابشده)، موقعیت روی صفحه و فهرست اقدامات موجود است. TalkBack این درخت را پیمایش کرده و هر گره را به ترتیب پیمایش صداگذاری میکند.
اگر View محتوای متنی نداشته باشد (مثلاً ImageView بدون توضیح)، برای TalkBack نامرئی میشود — کاربر از وجود آن مطلع نخواهد شد. برای حل این مشکل، توسعهدهنده contentDescription — توضیح متنی که TalkBack به جای سکوت میگوید — را تنظیم میکند. Android همچنین stateDescription را برای عناصر با وضعیت قابل تغییر (انتخابشده/انتخابنشده) و hintText را برای فیلدهای ورودی با راهنما پشتیبانی میکند.
TalkBack حرکات استاندارد Android را به حرکات خاص صفحهخوان تبدیل میکند. بیشتر عملیات با یک یا دو انگشت انجام میشود و حرکات سه انگشتی برای اقدامات جهانی رزرو شدهاند.
| عمل | حرکت | نتیجه |
|---|---|---|
| صداگذاری عنصر | لمس با ۱ انگشت | نام و نوع عنصر را میگوید |
| فعالسازی | لمس دوبل | فشار دکمه یا انتقال |
| بعدی | کشیدن به راست | عنصر بعدی |
| قبلی | کشیدن به چپ | عنصر قبلی |
| پیمایش | ۲ انگشت کشیدن | پیمایش لیست |
| منوی TalkBack | کشیدن بالا-چپ | منوی سراسری تنظیمات |
حرکت «کشیدن بالا-چپ» (کشیدن L-shaped) منوی سراسری TalkBack را باز میکند، جایی که کاربر میتواند سرعت گفتار را تغییر دهد، پرده صفحه را فعال کند، آموزش را راهاندازی کرده یا تنظیمات را باز کند. TalkBack همچنین منوی زمینهای برای عناصر پشتیبانی میکند: کشیدن بالا-راست فهرست اقدامات موجود برای عنصر جاری را باز میکند (مثلاً «کپی»، «چسباندن» برای فیلد متنی یا «حذف» برای پیام چت).
Android API غنی برای تنظیم دسترسی فراهم میکند. سطح پایه contentDescription است، اما برای پشتیبانی باکیفیت از TalkBack کار با AccessibilityNodeInfo، AccessibilityDelegate و LiveRegion لازم است.
ویژگی android:contentDescription توضیح متنی عنصر را برای TalkBack تعیین میکند. این ویژگی برای ImageView، ImageButton، FloatingActionButton و هر View سفارشی بدون محتوای متنی الزامی است. برای عناصر استاندارد (TextView، Button) contentDescription اختیاری است — TalkBack متن را به صورت خودکار میخواند.
val avatarView = ImageView(this)
avatarView.contentDescription = "آواتار کاربر"
avatarView.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_YES
val playButton = ImageButton(this)
playButton.contentDescription = "پخش ویدیو"
val progressBar = ProgressBar(this)
progressBar.importantForAccessibility =
IMPORTANT_FOR_ACCESSIBILITY_NO
پرچم importantForAccessibility دید عنصر را برای TalkBack کنترل میکند. مقدار NO عنصر را از درخت دسترسی پنهان میکند — برای تصاویر تزئینی، نشانگرها و پسزمینههای سفارشی مفید است. مقدار YES عنصر را حتی بدون متن به اجبار در پیمایش قرار میدهد. مهم است که از NO سوءاستفاده نشود: پنهان کردن عناصر معنایی مهم، برنامه را برای کاربران TalkBack غیرقابل دسترس میکند.
برای Viewهای سفارشی که از کنترلکنندههای کلیک استاندارد استفاده نمیکنند، باید AccessibilityDelegate — کلاسی که رویدادهای دسترسی را پردازش میکند — بازنویسی شود. دلیگیت امکان تنظیم توضیح سفارشی، نوع عنصر و فهرست اقدامات موجود را فراهم میکند که TalkBack از طریق منوی زمینهای به کاربر ارائه میدهد.
class CustomButtonDelegate : View.AccessibilityDelegate() {
override fun onInitializeAccessibilityNodeInfo(
host: View, info: AccessibilityNodeInfoCompat
) {
super.onInitializeAccessibilityNodeInfo(host, info)
info.text = "دکمه سفارشی"
info.className = Button::class.java.name
info.addAction(
AccessibilityNodeInfoCompat.AccessibilityActionCompat(
R.id.custom_action, "اشتراکگذاری"
)
)
}
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)
}
}
در مثال، دلیگیت به TalkBack اطلاع میدهد که عنصر یک دکمه است (className = Button) و اقدام سفارشی «اشتراکگذاری» را ارائه میدهد که در منوی زمینهای TalkBack ظاهر میشود. متد performAccessibilityAction فراخوانی این اقدام را پردازش میکند. بدون دلیگیت، TalkBack View سفارشی را به عنوان یک ناحیه ساده بدون تعامل درک میکرد و کاربر نمیتوانست با آن تعامل داشته باشد.
پشتیبانی کامل از TalkBack نه تنها contentDescription، بلکه مدیریت فوکوس، LiveRegion برای بهروزرسانیهای پویا، آزمایش با صفحهخوان فعال و تطبیق با نسخههای مختلف Android را شامل میشود.
وقتی محتوای صفحه بدون اقدام صریح کاربر تغییر میکند (مثلاً اعلان پیام جدید ظاهر میشود یا شمارنده لایکها بهروز میشود)، TalkBack باید اعلان دریافت کند. برای این کار از ویژگی android:accessibilityLiveRegion برای View در XML یا متد setAccessibilityLiveRegion() در کد استفاده میشود. مقدار polite اعلان را پس از اتمام صداگذاری جاری اضافه میکند و مقدار assertive بلافاصله آن را قطع میکند.
val statusText = TextView(this)
statusText.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_POLITE
// هنگام بهروزرسانی متن، TalkBack به طور خودکار
// تغییر را اعلام میکند
statusText.text = "پیام جدید از آنّا"
// برای اعلانهای بحرانی — assertive
errorBanner.accessibilityLiveRegion =
View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE
LiveRegion — معادل UIAccessibility.post در iOS است. برای اکثر بهروزرسانیها از polite استفاده کنید (پیامهای جدید، بهروزرسانی وضعیت) و assertive فقط برای خطاهای بحرانی (پرداخت ناموفق، قطع اتصال). استفاده بیش از حد از assertive تجربه کاربری منفی ایجاد میکند — TalkBack دائماً صداگذاری جاری را قطع میکند.
برای صفحات پیچیده که چندین View یک واحد منطقی تشکیل میدهند، از AccessibilityNodeProvider یا focusSearch برای بازنویسی ناوبری استفاده میشود. مثلاً یک تقویم سفارشی با ۴۲ خانه (۶ هفته × ۷ روز) نباید کاربر را مجبور به پیمایش همه ۴۲ عنصر برای رفتن به بلوک بعدی کند. توسعهدهنده میتواند خانهها را در گروههای منطقی ترکیب کند: ماه → هفته → روز.
برای Jetpack Compose از اصلاحکننده .semantics {} استفاده میشود که API مشابهی ارائه میدهد: contentDescription، liveRegion، stateDescription، disabled و customActions. Compose همچنین از mergeDescendants برای ترکیب语义های فرزند در یکی پشتیبانی میکند که گروهبندی عناصر را بدون تنظیم دستی accessibilityDelegate برای هر View ساده میکند.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("ارسال پیام")
stateDescription("آماده ارسال")
}
) {
Icon(Icons.Filled.Send, "ارسال")
}
آزمایش TalkBack از طریق دستگاه فیزیکی یا شبیهساز با سرویس فعال انجام میشود. توصیه میشود سناریوهای کلیدی کاربر را با صفحه خاموش (Screen Curtain) طی کنید — این فقدان کامل بازخورد بصری را شبیهسازی میکند. Android همچنین Accessibility Scanner را ارائه میدهد — ابزاری برای تشخیص خودکار مشکلات دسترسی که عناصر بدون contentDescription، مناطق لمسی خیلی کوچک و کنتراست پایین را برجسته میکند.
سوالات متداول
تنظیمات → دسترسی → TalkBack → فعال. برای فعالسازی سریع از فشار همزمان هر دو کلید صدا به مدت ۳ ثانیه استفاده میشود. Google Assistant همچنین میتواند TalkBack را با فرمان صوتی «TalkBack را فعال کن» روشن کند.
TalkBack — صفحهخوان برای Android، VoiceOver — برای iOS. TalkBack از AccessibilityService و فوکوس دسترسی با قاب زرد استفاده میکند، در حالی که VoiceOver از UIAccessibility و rotator. حرکات و منوها متفاوت هستند: TalkBack دارای کشیدنهای L-shaped برای منوی سراسری است.
برای همه ImageViewها و عناصر سفارشی contentDescription تنظیم کنید. از importantForAccessibility برای پنهان کردن عناصر تزئینی استفاده کنید. accessibilityLiveRegion را برای بهروزرسانیهای پویا پیکربندی کرده و با Accessibility Scanner بررسی کنید. در Compose از اصلاحکننده .semantics{} استفاده کنید.
این یک شیء است که عنصر رابط کاربری را در درخت دسترسی نشان میدهد. شامل متن، نوع، وضعیت، موقعیت و فهرست اقدامات است. TalkBack این درخت را برای ناوبری پیمایش میکند. توسعهدهنده میتواند آن را از طریق AccessibilityDelegate یا ویژگیهای XML تغییر دهد.
importantForAccessibility را بررسی کنید — ممکن است روی NO تنظیم شده باشد. مطمئن شوید contentDescription برای عناصر بدون متن تنظیم شده است. برای Viewهای سفارشی AccessibilityDelegate با onInitializeAccessibilityNodeInfo پیادهسازی کنید. از Accessibility Scanner برای تشخیص استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید