أفضل ممارسات إمكانية الوصول لتطبيق Android TV

يوفّر هذا الدليل أفضل الممارسات لإمكانية الوصول على Android TV، كما يقدّم اقتراحات لكل من التطبيقات الأصلية وغير المحلية.

لماذا تُعدّ تسهيل الاستخدام مهمة بالنسبة إلى تطبيق البث التلفزيوني الخاص بي؟

تُعد إعاقات الرؤية غير شائعة بين الأشخاص الذين يشاهدون التلفزيون. وفقًا لمنظمة الصحة العالمية (WHO)، يعاني 2.2 مليار شخص على مستوى العالم من ضعف البصر. في الولايات المتحدة، يعاني 32 مليون أمريكي بعمر 18 عامًا وما فوق من فقدان كبير في الرؤية، وفقًا لاستطلاع المقابلة الصحية الوطنية لعام 2018. في أوروبا، تشير التقديرات إلى 30 مليون شخص كفيف وضعف البصر، وفقًا للاتحاد الأوروبي للمكفوفين (EBU).

والأهم من ذلك، أن المستخدمين الذين يعانون من إعاقات بصرية يستمتعون بمحتوى الوسائط تمامًا مثل أقرانهم ذوي الرؤية الكاملة. أظهر استطلاع تم إجراؤه في عام 2017 أجرته شركة Comcast أن 96% من المستخدمين المكفوفين أو ضعاف البصر يشاهدون التلفزيون بانتظام، و81% يشاهدون أكثر من ساعة واحدة يوميًا. ومع ذلك، أفاد 65٪ أيضًا عن مواجهة مشكلات في البحث عما يتم عرضه على التلفزيون. وفي استطلاع تم إجراؤه في عام 2020 في المملكة المتحدة، قال 80% من ذوي الاحتياجات الخاصة إنّهم يواجهون مشاكل في إمكانية الوصول إلى خدمات بث الفيديوهات عند الطلب.

على الرغم من أنّ التكنولوجيا المساعِدة يمكن أن تساعد المستخدمين الذين يعانون من ضعف في النظر، ولكن من المهم دعم إمكانية الوصول في رحلات استكشاف المحتوى الخاصة بتطبيقات التلفزيون. على سبيل المثال، يجب إيلاء اهتمام إضافي لتوفير إرشادات التنقل وتصنيف العناصر بشكل صحيح، والتأكد من أن تطبيقات التلفزيون تعمل بشكل جيد مع ميزات تسهيل الاستخدام مثل TalkBack. يمكن أن تحسن هذه الخطوات بشكل كبير تجربة المستخدمين الذين يعانون من إعاقات بصرية.

تتمثل الخطوة الأولى نحو تحسين إمكانية الوصول في الوعي. يمكن أن يساعدك هذا الدليل أنت وفريقك في الكشف عن مشاكل إمكانية الوصول في تطبيق التلفزيون.

موارد إمكانية الوصول في Android

لمعرفة مزيد من المعلومات حول إمكانية الوصول على Android، يمكنك الاطّلاع على موارد تطوير إمكانية الوصول.

تكبير حجم النص

يجب أن تراعي تطبيقات Android TV تفضيل المستخدم لتحجيم النص من خلال إتاحة كثافات وحدات بكسل مختلفة.

ويُرجى الانتباه بشكل خاص لما يلي:

  • استخدِم wrap_content للسمات في مكوّنات واجهة المستخدم.
  • تأكد من أن التخطيطات تعيد ترتيب المكونات مع تغير أبعادها بناءً على مقياس النص.
  • تأكد من أن المكونات لا تزال تناسب الشاشة في أحجام نص أكبر.
  • لا تستخدم وحدات حجم النص sp للمكونات غير المرنة.
  • التحقق من قيمة FONT_SCALE للتعديل في طرق العرض المخصّصة:

    // Checking font scale with Context
    val scale = resources.configuration.fontScale
    Log.d(TAG, "Text scale is: " + scale)
    

يمكن تغيير مقياس النص باستخدام الأمر التالي:

adb shell settings put system font_scale 1.2f

في نظام التشغيل Android 12 والإصدارات الأحدث، يمكن للمستخدمين تغيير حجم النص من إعدادات الجهاز.

تخطيطات لوحة المفاتيح

في Android 13 (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام getKeyCodeForKeyLocation() للبحث عن رموز المفاتيح عن المواقع الجغرافية الرئيسية المتوقّعة. قد يكون هذا ضروريًا إذا أعاد المستخدم تعيين بعض المواقع الرئيسية أو إذا كان يستخدم لوحة مفاتيح ليس لها تخطيط نموذجي.

الوصف الصوتي

في Android 13 (المستوى 33 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يتيح إعداد مفضّل جديد لإمكانية الوصول على مستوى النظام للمستخدمين تفعيل أوصاف الصوت في جميع التطبيقات. يمكن لتطبيقات Android TV التحقّق من إعدادات المستخدم المفضّلة من خلال إرسال طلب بحث عنها باستخدام isAudioDescriptionRequested().

Kotlin


private lateinit var accessibilityManager: AccessibilityManager

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)

// Where your media player is initialized
if (am.isAudioDescriptionRequested) {
    // User has requested to enable audio descriptions
}

Java


private AccessibilityManager accessibilityManager;

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager.class);

// Where your media player is initialized
if(accessibilityManager.isAudioDescriptionRequested()) {
    // User has requested to enable audio descriptions
}

يمكن لتطبيقات Android TV رصد تغيُّر إعدادات المستخدم المفضّلة من خلال إضافة مستمع إلى AccessibilityManager:

Kotlin


private val listener =
    AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
        // Preference changed; reflect its state in your media player
    }

override fun onStart() {
    super.onStart()

    accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}

override fun onStop() {
    super.onStop()

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}

Java


private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> {
    // Preference changed; reflect its state in your media player
};

@Override
protected void onStart() {
    super.onStart();

    accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener);
}

@Override
protected void onStop() {
    super.onStop();

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener);
}