TalkBack هو قارئ شاشة مضمّن من Google لـ Android، وهو جزء من حزمة Android Accessibility Suite. يقوم بنطق عناصر الواجهة ويسمح بالتحكم في الجهاز باستخدام الإيماءات، مما يوفر للمستخدمين المكفوفين وضعاف البصر وصولاً كاملاً إلى وظائف الهاتف الذكي. وفقاً لـ Google Accessibility Help (2025)، TalkBack مثبّت مسبقاً على معظم أجهزة Android ويدعم أكثر من 30 لغة بمحركات صوت مختلفة.
النقاط الرئيسية
TalkBack هو قارئ شاشة لـ Android، طورته Google وهو جزء من Android Accessibility Suite. يوفر تغذية ردود صوتية وتحكماً بالإيماءات للمستخدمين من ذوي الإعاقات البصرية. يعمل TalkBack على الهواتف الذكية والأجهزة اللوحية وتلفازات Smart TV والأجهزة القابلة الارتداء التي تعمل بـ Wear OS.
ظهر TalkBack لأول مرة في Android 1.6 (Donut) عام 2009. في البداية كان مشروعاً منفصلاً، ولكن مع إطلاق Android 4.0 (Ice Cream Sandwich) أصبح جزءً من Android Accessibility Suite — مجموعة خدمات تضم أيضاً Switch Access و Select to Speak. بدءً من Android 10، TalkBack مثبّت مسبقاً على جميع الأجهزة التي تحتوي على خدمات Google Play، بما في ذلك أجهزة الشركاء — Samsung و Xiaomi و Oppo وغيرها.
TalkBack يدعم أكثر من 30 لغة بمحركات صوت مختلفة: Google Text-to-Speech و Samsung TTS ومحركات جهات ثالثة. للعربية، يوفر Google TTS نطقاً طبيعياً ونبرات صحيحة. يمكن للمستخدم ضبط سرعة الكلام ودرجة الصوت واختيار جنس الصوت في إعدادات TalkBack.
يعمل TalkBack استناداً إلى AccessibilityService — آلية نظامية في Android تسمح للتطبيقات باستقبال معلومات عن حالة الواجهة والتفاعل معها برمجياً. عندمت يُفعّل TalkBack، يعترض جميع أحداث اللمس ويحوّلها إلى إيماءات قارئ شاشة خاصة.
العنصر الرئيسي في عمل TalkBack هو بؤر الإتاحة. على عكس بؤر الإدخال القياسي، الذي يظهر كتمييز لحقل النص، يتم عرض بؤر الإتاحة كإطار أصفر حول العنصر وهو غير مرئي للمستخدمين بدون TalkBack. عندما يصل بؤر الإتاحة إلى عنصر، يقوم TalkBack بنطق محتواه ونوعه وحالته.
يقوم المستخدم بتحريك بؤر الإتاحة باستخدام الإيماءات: التمرير لليمين — العنصر التالي، التمرير لليسار — العنصر السابق. يتم تصفح العناصر بالترتيب الذي تحدده AccessibilityNodeInfo — شجرة الإتاحة التي يبنيها Android لكل شاشة. يمكن للمطور التأثير على الترتيب من خلال خاصيتي accessibilityTraversalBefore و accessibilityTraversalAfter، وهو أمر مهم بشكل خاص للشاشات المعقدة ذات التصاميم المخصصة.
كل عنصر View على الشاشة يمثّله عقدة في شجرة الإتاحة — كائن AccessibilityNodeInfo. يحتوي هذا الكائن على: نص العنصر (contentDescription أو نص العرض)، نوع العنصر (زر، خانة اختيار، حقل إدخال)، الحالة (مفعّل/معطّل/مختار)، الموقع على الشاشة وقائمة الإجراءات المتاحة. يتصفح TalkBack هذه الشجرة وينطق كل عقدة بترتيب التصفح.
إذا لم يكن للعرض محتوى نصي (u0645ثل ImageView بدون وصف)، فإنه يصبح غير مرئي لـ TalkBack — لن يعلم المستخدم بوجوده. لحل هذه المشكلة، يقوم المطور تعيين contentDescription — وصف نصي ينطقه TalkBack بدلاً من الصمت. يدعم Android أيضاً stateDescription للعناصر ذات الحالة القابلة للتغيير (محدد/غير محدد) و hintText لحقول الإدخال بالتوصيحات.
يحوّل TalkBack إيماءات Android القياسية إلى إيماءات قارئ شاشة خاصة. تؤدّى معظم العمليات بإصبع واحد أو إصبعين، بينما تكون إيماءات ثلاث أصابع مخصصة للإجراءات العامة.
| الإجراء | الإيماء | النتيجة |
|---|---|---|
| نطق العنصر | لمسة واحدة | ينطق اسم العنصر ونوعه |
| تنشيط | نقرتان | ضغط زر أو انتقال |
| التالي | تمرير لليمين | العنصر التالي |
| السابق | تمرير لليسار | العنصر السابق |
| تمرير | تمرير بإصبعين | تمرير القائمة |
| قائمة TalkBack | تمرير للأعلى-اليسار | قائمة الإعدادات العامة |
إيماء التمرير للأعلى-اليسار (تمرير على شكل L) يفتح قائمة TalkBack العامة، حيث يمكن للمستخدم تغيير سرعة الكلام، أو تفعيل شاشة التعتيم، أو بدء البرنامج التعليمي أو فتح الإعدادات. يدعم TalkBack أيضاً قائمة سياق للعناصر: يفتح التمرير للأعلى-اليمين قائمة بالإجراءات المتاحة للعنصر الحالي (على سبيل المثال، «نسخ» و«لصق» لحقل نصي أو «حذف» لرسالة دردشة).
يوفر Android API غنياً لتهيئة إمكانية الوصول. المستوى الأساسي هو contentDescription، ولكن للدعم المتقدّم لـ TalkBack يلزم العمل مع AccessibilityNodeInfo و AccessibilityDelegate و LiveRegion.
السمة android:contentDescription تحدد الوصف النصي للعنصر لـ TalkBack. هي 必要ية لـ ImageView و ImageButton و FloatingActionButton وأي عرض مخصص بدون محتوى نصي. للعناصر القياسية (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.
بالنسبة للعروض المخصصة التي لا تستخدم معالجات النقر القياسية، يلزم تجاوز 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 إلى العرض المخصص على أنه منطقة غير تفاعلية عادية، ولن يتمكن المستخدم من التفاعل معه.
يشمل الدعم الكامل لـ 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 هو المكافئ في Android لـ UIAccessibility.post على iOS. استخدم polite لمعظم التحديثات (رسائل جديدة، تحديثات الحالة) و assertive فقط للأخطاء الحرجة (دفع فاشل، فقدان الاتصال). الاستخدام المفرط لـ assertive يخلق تجربة مستخدم سلبية — سيقاطع TalkBack النطق الحالي بشكل مستمر.
للشاشات المعقدة حيث تشكّل عدة Views وحدة منطقية واحدة، يستخدم AccessibilityNodeProvider أو focusSearch لتجاوز التنقل. على سبيل المثال، تقويم مخصص بـ 42 خلية (6 أسابيع × 7 أيام) لا يجب أن يجبر المستخدم على التمرير خلال جميع العناصر البالغ عددها 42 للوصول إلى القسم التالي. يمكن للمطور تجميع الخلايا في وحدات منطقية: شهر → أسبوع → يوم.
لـ Jetpack Compose، يوفر معدّل .semantics {} API مماثلاً: contentDescription و liveRegion و stateDescription و disabled و customActions. يدعم Compose أيضاً mergeDescendants لدمج الدلالات الفرعية في دلالة واحدة، مما يبسط تجميع العناصر بدون تكوين مفوض accessibilityDelegate يدوياً لكل عرض.
Button(
onClick = { sendMessage() },
modifier = Modifier.semantics {
contentDescription("إرسال رسالة")
stateDescription("جاهز للإرسال")
}
) {
Icon(Icons.Filled.Send, "إرسال")
}
يتم اختبار TalkBack باستخدام جهاز فعلي أو محاكي مع تفعيل الخدمة. يوصى باجتياز سيناريوهات المستخدم الرئيسية مع إطفاء الشاشة (Screen Curtain) — وهذا يحاكي عدم وجود تغذية مرئية بالكامل. يوفر Android أيضاً Accessibility Scanner — أداة للكشف التلقائي عن مشاكل الإتاحة، تقوم بتسليط الضوء على العناصر التي لا تحتوي على contentDescription ومناطق اللمس صغيرة جداً والتباين المنخفض.
الأسئلة الشائعة
الإعدادات → إمكانية الوصول → TalkBack → تفعيل. للتفعيل السريع، اضغط على مفتاحي الصوت معاً لمدة 3 ثوان. Google Assistant يستطيع أيضاً تفعيل TalkBack بأمر صوتي «فعّل TalkBack».
TalkBack هو قارئ شاشة لـ Android، و VoiceOver لـ iOS. TalkBack يستخدم AccessibilityService وبؤر الإتاحة مع إطار أصفر، بينما يستخدم VoiceOver UIAccessibility والدوار. تختلف الإيماءات والقوائم: لدى TalkBack إيماءات على شكل L للقائمة العامة.
ضبط contentDescription لجميع ImageView والعناصر المخصصة. استخدم importantForAccessibility لإخفاء العناصر الزخرفية. ضبط accessibilityLiveRegion للتحديثات الديناميكية وتحقق باستخدام Accessibility Scanner. في Compose، استخدم المعدّل .semantics{}.
هو كائن يمثّل عنصر واجهة في شجرة الإتاحة. يحتوي على نص ونوع وحالة وموقع وقائمة إجراءات. TalkBack يتصفح هذه الشجرة للتنقل. يمكن للمطور تعديله من خلال AccessibilityDelegate أو سمات XML.
تحقق من importantForAccessibility — قد يكون مضبوطاً على NO. تأكد من أن contentDescription محدّد للعناصر بدون نص. للعروض المخصصة، قم بتنفيذ AccessibilityDelegate مع onInitializeAccessibilityNodeInfo. استخدم Accessibility Scanner للتشخيص.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا