Android TV पर पसंद के मुताबिक व्यू की सुलभता सुविधा

Android TV के कई ऐप्लिकेशन, Android के नेटिव कॉम्पोनेंट का इस्तेमाल करके बनाए जाते हैं. हालांकि, तीसरे पक्ष के फ़्रेमवर्क या कॉम्पोनेंट की पहुंच के बारे में भी सोचना ज़रूरी है. खास तौर पर, कस्टम व्यू का इस्तेमाल करते समय.

OpenGL या Canvas के साथ सीधे तौर पर इंटरफ़ेस करने वाले कस्टम व्यू कॉम्पोनेंट, Talkback और बटन से ऐक्सेस करें जैसी सुलभता सेवाओं के साथ ठीक से काम नहीं कर सकते.

TalkBack चालू होने पर, ये समस्याएं हो सकती हैं:

  • ऐसा हो सकता है कि आपके ऐप्लिकेशन में, ऐक्सेसिबिलिटी फ़ोकस (हरे रंग का आयत) गायब हो जाए.
  • ऐसा हो सकता है कि सुलभता फ़ोकस, पूरी स्क्रीन की सीमा को चुन ले.
  • ऐसा हो सकता है कि ऐक्सेसिबिलिटी फ़ोकस को दूसरी जगह न ले जाया जा सके.
  • डी-पैड पर मौजूद चार दिशाओं वाली कुंजियों का कोई असर नहीं हो सकता. भले ही, आपका कोड उन्हें हैंडल कर रहा हो.

अगर आपको अपने ऐप्लिकेशन में इनमें से कोई समस्या दिखती है, तो पक्का करें कि आपका ऐप्लिकेशन, सुलभता सेवाओं को अपना AccessibilityNodeInfo ट्री दिखाता हो.

इस गाइड के बाकी हिस्से में, इन समस्याओं को हल करने के कुछ तरीके और सबसे सही तरीके दिए गए हैं.

डी-पैड इवेंट, ऐक्सेसिबिलिटी सेवाओं के ज़रिए इस्तेमाल किए जाते हैं

इस समस्या की मुख्य वजह यह है कि मुख्य इवेंट का इस्तेमाल ऐक्सेसिबिलिटी सेवाओं के लिए किया जाता है.

डी-पैड इवेंट का इस्तेमाल और Talkback
पहली इमेज. इन डायग्राम में दिखाया गया है कि TalkBack चालू और बंद होने पर, सिस्टम कैसे काम करता है.

पहले चित्र में दिखाया गया है कि TalkBack चालू होने पर, डी-पैड इवेंट को डेवलपर की ओर से तय किए गए डी-पैड हैंडलर को नहीं भेजा जाता. इसके बजाय, सुलभता सेवाएं मुख्य इवेंट को रिसीव करती हैं, ताकि वे सुलभता फ़ोकस को मूव कर सकें. कस्टम Android कॉम्पोनेंट, डिफ़ॉल्ट रूप से सुलभता सेवाओं को स्क्रीन पर अपनी जगह की जानकारी नहीं देते. इसलिए, सुलभता सेवाएं उन्हें हाइलाइट करने के लिए, सुलभता फ़ोकस को दूसरी जगह नहीं ले जा सकतीं.

सुलभता से जुड़ी अन्य सेवाओं पर भी इसी तरह का असर पड़ता है: बटन से ऐक्सेस करें का इस्तेमाल करते समय, डी-पैड इवेंट भी इस्तेमाल किए जा सकते हैं.

डी-पैड इवेंट, ऐक्सेसिबिलिटी सेवाओं को सबमिट किए जाते हैं. साथ ही, इस सेवा को यह नहीं पता होता कि कस्टम व्यू में यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट कहां हैं. इसलिए, आपको अपने ऐप्लिकेशन के लिए AccessibilityNodeInfo लागू करना होगा, ताकि वह कुंजी वाले इवेंट को सही तरीके से फ़ॉरवर्ड कर सके.

सुलभता सेवाओं के लिए जानकारी उपलब्ध कराना

कस्टम व्यू की जगह और ब्यौरे के बारे में पूरी जानकारी के साथ ऐक्सेसिबिलिटी सेवाएं देने के लिए, AccessibilityNodeInfo लागू करें, ताकि हर कॉम्पोनेंट के बारे में जानकारी दी जा सके. व्यू के लॉजिकल संबंध को तय करने के लिए, ExploreByTouchHelper को लागू करें. साथ ही, इसे ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) का इस्तेमाल करके सेट करें, ताकि सुलभता सेवाएं फ़ोकस को मैनेज कर सकें.

ExploreByTouchHelper को लागू करते समय, इसके चार ऐब्स्ट्रैक्ट तरीकों को ओवरराइड करें:

Kotlin

// Return the virtual view ID whose view is covered by the input point (x, y).
protected fun getVirtualViewAt(x: Float, y: Float): Int

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected fun getVisibleVirtualViews(virtualViewIds: List<Int>)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat)

// Set the accessibility handling when perform action.
protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean

Java

// Return the virtual view ID whose view is covered by the input point (x, y).
protected int getVirtualViewAt(float x, float y)

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected void getVisibleVirtualViews(List<Integer> virtualViewIds)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node)

// Set the accessibility handling when perform action.
protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)

ज़्यादा जानकारी के लिए, Google I/O 2013 - Enabling Blind and Low-Vision Accessibility on Android देखें या populating accessibility events के बारे में ज़्यादा पढ़ें.

सबसे सही तरीके

  • ज़रूरी है: AccessibilityNodeInfo.getBoundsInScreen() को कॉम्पोनेंट की जगह तय करनी होगी.

  • ज़रूरी है: AccessibilityNodeInfo.setVisibleToUser() से कॉम्पोनेंट के दिखने की स्थिति का पता चलना चाहिए.

  • ज़रूरी है: AccessibilityNodeInfo.getContentDescription() को कॉन्टेंट के ब्यौरे के बारे में बताना होगा, ताकि TalkBack उसे पढ़कर सुना सके.

  • AccessibilityNodeInfo.setClassName() तय करें, ताकि सेवाएं कॉम्पोनेंट टाइप की पहचान कर सकें.

  • performAction() को लागू करते समय, कार्रवाई को उससे जुड़े AccessibilityEvent का इस्तेमाल करके दिखाएं.

  • ACTION_CLICK जैसे ज़्यादा ऐक्शन टाइप लागू करने के लिए, performAction() में मौजूद लॉजिक का इस्तेमाल करके AccessibilityNodeInfo.addAction(ACTION_CLICK) को लागू करें.

  • लागू होने पर, setFocusable(), setClickable(), setScrollable(), और इसी तरह के अन्य तरीकों के लिए कॉम्पोनेंट की स्थिति दिखाएं.

  • AccessibilityNodeInfo के दस्तावेज़ पढ़ें. इससे आपको यह पता चलेगा कि सुलभता सेवाएं, आपके कॉम्पोनेंट के साथ बेहतर तरीके से इंटरैक्ट करने के लिए और कौनसे तरीके अपना सकती हैं.

नमूना

कस्टम व्यू का इस्तेमाल करने वाले ऐप्लिकेशन में सुलभता की सुविधा जोड़ने के सबसे सही तरीके जानने के लिए, Android TV के लिए कस्टम व्यू की सुलभता का सैंपल देखें.