تطوير خدمة لتسهيل الاستخدام لنظام Android

1. مقدمة

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

ما هي خدمة تسهيل الاستخدام؟

تساعد "خدمة تسهيل الاستخدام" المستخدمين من ذوي الاحتياجات الخاصة في استخدام أجهزة Android وتطبيقاته. وهي خدمة مميّزة تعمل لفترة طويلة وتساعد المستخدمين في معالجة المعلومات المعروضة على الشاشة وتتيح لهم التفاعل بشكل مفيد مع الجهاز.

أمثلة على الخدمات الشائعة لتسهيل الاستخدام

  • الوصول عبر مفتاح تحكّم: تتيح هذه الميزة لمستخدمي Android الذين يعانون من مشاكل في الحركة التفاعل مع الأجهزة باستخدام مفتاح تحكّم واحد أو أكثر.
  • الاستخدام عبر الصوت (إصدار تجريبي): يتيح لمستخدمي Android الذين يعانون من مشاكل في الحركة التحكّم في الجهاز باستخدام الطلبات الصوتية.
  • TalkBack: قارئ شاشة شائع الاستخدام من قِبل المستخدمين المكفوفين أو ذوي العجز البصري.

إنشاء خدمة مخصّصة لتسهيل الاستخدام

مع أنّ Google توفّر خدمات مثل "الوصول عبر مفتاح تحكّم" و"الوصول الصوتي" وTalkback لمستخدمي Android، لا يمكن لهذه الخدمات أن تلبّي احتياجات جميع المستخدمين من ذوي الاحتياجات الخاصة. بما أنّ العديد من المستخدمين ذوي الاحتياجات الخاصة لديهم احتياجات فريدة، فإنّ واجهات برمجة التطبيقات في Android لإنشاء خدمات تسهيل الاستخدام مفتوحة، ويمكن للمطوّرين إنشاء خدمات تسهيل الاستخدام وتوزيعها من خلال "متجر Play".

ما ستنشئه

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

تتسم واجهة برمجة التطبيقات Accessibility API بأنّها فعّالة، فالرمز البرمجي للخدمة التي ستنشئها يتضمّن أربعة ملفات فقط، ويستخدم حوالي 200 سطر من الرمز البرمجي.

المستخدم النهائي

ستنشئ خدمة لمستخدم افتراضي بالخصائص التالية:

  • يواجه المستخدم صعوبة في الوصول إلى الأزرار الجانبية على الجهاز.
  • يواجه المستخدم صعوبة في التمرير أو التمرير السريع.

تفاصيل الخدمة

ستعرض خدمتك شريط إجراءات عامًا على الشاشة. يمكن للمستخدم النقر على الأزرار في هذا الشريط لتنفيذ الإجراءات التالية:

  1. إيقاف تشغيل الجهاز بدون الوصول إلى زر التشغيل الفعلي على جانب الهاتف
  2. ضبط مستوى الصوت بدون لمس زرَّي التحكّم بمستوى الصوت على جانب الهاتف
  3. تنفيذ إجراءات التمرير بدون التمرير فعليًا
  4. تنفيذ تمرير سريع بدون الحاجة إلى استخدام إيماءة التمرير السريع

المتطلبات

يفترض هذا الدرس التطبيقي حول الترميز أنّك ستستخدم ما يلي:

  1. جهاز كمبيوتر يعمل عليه "استوديو Android"
  2. وحدة طرفية لتنفيذ أوامر shell بسيطة
  3. جهاز يعمل بالإصدار Android 7.0 (Nougat) ومتصل بجهاز الكمبيوتر الذي ستستخدمه في عملية التطوير

لِنبدأ.

2. الإعداد

باستخدام سطر الأوامر، أنشئ دليلًا ستعمل فيه. انتقِل إلى هذا الدليل.

تنزيل الرمز

يمكنك استنساخ المستودع الذي يحتوي على الرمز البرمجي لهذا الدرس التطبيقي حول الترميز:

git clone https://github.com/android/codelab-android-accessibility.git

يحتوي المستودع على العديد من مشاريع "استوديو Android". باستخدام "استوديو Android"، افتح GlobalActionBarService.

شغِّل "استوديو Android" من خلال النقر على رمز "استوديو":

الشعار المستخدَم لتشغيل "استوديو Android"

اختَر الخيار استيراد مشروع (Eclipse ADT وGradle وما إلى ذلك):

شاشة الترحيب في "استوديو Android"

انتقِل إلى الموقع الذي استنسخت فيه المصدر، واختَر GlobalActionBarService.

بعد ذلك، غيِّر إلى الدليل الجذر باستخدام نافذة طرفية.

3- فهم رمز البدء

استكشاف المشروع الذي فتحته

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

  1. app/src/main/AndroidManifest.xml
  2. app/src/main/res/layout/action_bar.xml
  3. app/src/main/res/xml/global_action_bar_service.xml
  4. app/src/main/java/com/example/android/globalactionbarservice/GlobalActionBarService.java

في ما يلي شرح لمحتوى كل ملف.

AndroidManifest.xml

يتم توضيح معلومات حول خدمة تسهيل الاستخدام في ملف البيان على النحو التالي:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.globalactionbarservice">

   <application>
       <service
           android:name=".GlobalActionBarService"
           android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
           android:exported="true">
           <intent-filter>
               <action android:name="android.accessibilityservice.AccessibilityService" />
           </intent-filter>
           <meta-data
               android:name="android.accessibilityservice"
               android:resource="@xml/global_action_bar_service" />
       </service>
   </application>
</manifest>

يتم تعريف العناصر الثلاثة المطلوبة التالية في ملف AndroidManifest.xml:

  1. إذن الالتزام بخدمة مخصّصة لتسهيل الاستخدام:
<service
    ...
    android:permission = "android.permission.BIND_ACCESSIBILITY_SERVICE">
    ...             
</service>
  1. الغرض من AccessibilityService:
<intent-filter>
   <action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
  1. موقع الملف الذي يحتوي على البيانات الوصفية للخدمة التي تريد إنشاءها:
<meta-data
       ...
       android:resource="@xml/global_action_bar_service" />
</service>

global_action_bar_service.xml

يحتوي هذا الملف على البيانات الوصفية للخدمة.

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
   android:accessibilityFeedbackType="feedbackGeneric"
   android:accessibilityFlags="flagDefault"
   android:canPerformGestures="true"
   android:canRetrieveWindowContent="true" />

باستخدام عنصر <accessibility-service>، تم تحديد البيانات الوصفية التالية:

  1. نوع الملاحظات لهذه الخدمة (يستخدم هذا الدرس التطبيقي حول الترميز feedbackGeneric، وهو إعداد تلقائي جيد).
  2. علامات تسهيل الاستخدام للخدمة (يستخدم هذا الدرس التطبيقي علامات تلقائية).
  3. الإمكانات المطلوبة للخدمة:
  4. لإجراء التمرير السريع، يتم ضبط android:canPerformGestures على true.
  5. لاسترداد محتوى النافذة، يتم ضبط android:canRetrieveWindowContent على true.

GlobalActionBarService.java

يتم تخزين معظم الرموز البرمجية لخدمة مخصّصة لتسهيل الاستخدام في GlobalActionBarService.java. في البداية، يحتوي الملف على الحد الأدنى المطلق من الرمز لخدمة مخصّصة لتسهيل الاستخدام:

  1. فئة توسّع AccessibilityService.
  2. بعض الطرق المطلوبة التي تم تجاهلها (تم تركها فارغة في هذا الدرس العملي).
public class GlobalActionBarService extends AccessibilityService {

   @Override
   public void onAccessibilityEvent(AccessibilityEvent event) {

   }

   @Override
   public void onInterrupt() {

   }
}

ستضيف رمزًا إلى هذا الملف أثناء درس تطبيقي حول الترميز.

action_bar.xml

تعرض الخدمة واجهة مستخدم تحتوي على أربعة أزرار، ويحتوي ملف التنسيق action_bar.xml على الترميز اللازم لعرض هذه الأزرار:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
</LinearLayout>

يحتوي هذا الملف على LinearLayout فارغ في الوقت الحالي. ستضيف ترميزًا للأزرار أثناء تجربة البرمجة.

تشغيل التطبيق

تأكَّد من توصيل جهاز بالكمبيوتر. انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. من المفترض أن يؤدي ذلك إلى تشغيل التطبيق الذي تعمل عليه.

انتقِل إلى الإعدادات > تسهيل الاستخدام. يجب أن يكون Global Action Bar Service مثبّتًا على جهازك.

شاشة إعدادات تسهيل الاستخدام

انقر على خدمة شريط الإجراءات الشاملة وفعِّلها. من المفترض أن يظهر لك مربّع حوار الإذن التالي:

مربّع حوار إذن الخدمة المخصّصة لتسهيل الاستخدام

تطلب خدمة مخصّصة لتسهيل الاستخدام إذنًا بتتبُّع إجراءات المستخدم واسترداد محتوى النوافذ وتنفيذ الإيماءات نيابةً عن المستخدم. عند استخدام خدمة مخصّصة لتسهيل الاستخدام تابعة لجهة خارجية، احرص على التأكّد من موثوقية المصدر.

لن يؤدي تشغيل الخدمة إلى أي إجراء، لأنّنا لم نضيف أي وظائف بعد. لنبدأ في ذلك.

4. إنشاء الأزرار

افتح الملف action_bar.xml في res/layout. أضِف الترميز داخل LinearLayout الفارغ حاليًا:

<LinearLayout ...>
    <Button
        android:id="@+id/power"
        android:text="@string/power"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/volume_up"
        android:text="@string/volume"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/scroll"
        android:text="@string/scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/swipe"
        android:text="@string/swipe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

يؤدي ذلك إلى إنشاء أزرار ينقر عليها المستخدم لتنفيذ إجراءات على الجهاز.

افتح GlobalActionBarService.java وأضِف متغيّرًا لتخزين التصميم الخاص بشريط الإجراءات:

public class GlobalActionBarService extends AccessibilityService {
    FrameLayout mLayout;
    ...
}

الآن، أضِف طريقة onServiceStarted():

public class GlobalActionBarService extends AccessibilityService {
   FrameLayout mLayout;

   @Override
   protected void onServiceConnected() {
       // Create an overlay and display the action bar
       WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
       mLayout = new FrameLayout(this);
       WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
       lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
       lp.format = PixelFormat.TRANSLUCENT;
       lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
       lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
       lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
       lp.gravity = Gravity.TOP;
       LayoutInflater inflater = LayoutInflater.from(this);
       inflater.inflate(R.layout.action_bar, mLayout);
       wm.addView(mLayout, lp);
   }
}

يعمل الرمز على تضخيم التنسيق وإضافة شريط الإجراءات إلى أعلى الشاشة.

يتم تنفيذ الطريقة onServiceConnected() عند ربط الخدمة. في الوقت الحالي، تملك خدمة مخصّصة لتسهيل الاستخدام جميع الأذونات اللازمة لتعمل. الإذن الأساسي الذي ستستخدمه هنا هو الإذن WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY. يتيح لك هذا الإذن الرسم مباشرةً على الشاشة فوق المحتوى الحالي بدون الحاجة إلى اتّباع مسار أذونات معقّد.

دورة حياة خدمة تسهيل الاستخدام

يدير النظام حصريًا دورة حياة خدمة مخصّصة لتسهيل الاستخدام، وهي تتبع دورة حياة الخدمة المحدّدة.

  • تبدأ خدمة مخصّصة لتسهيل الاستخدام عندما يفعّلها المستخدم بشكل صريح في إعدادات الجهاز.
  • بعد أن يربط النظام خدمة، يستدعي الدالة onServiceConnected(). ويمكن للخدمات التي تريد تنفيذ عملية إعداد بعد الربط إلغاء هذه الدالة.
  • يتم إيقاف خدمة مخصّصة لتسهيل الاستخدام إما عندما يوقفها المستخدم في إعدادات الجهاز أو عندما تستدعي الدالة disableSelf().

تشغيل الخدمة

قبل إطلاق الخدمة باستخدام Android Studio، عليك التأكّد من ضبط إعدادات "التشغيل" بشكل صحيح.

عدِّل إعدادات التشغيل (استخدِم "تشغيل" من القائمة العلوية وانتقِل إلى "تعديل الإعدادات"). بعد ذلك، استخدِم القائمة المنسدلة لتغيير "خيار التشغيل" من "النشاط التلقائي" إلى "لا شيء".

انقر على السهم المنسدل لضبط إعدادات التشغيل من أجل تشغيل خدمة باستخدام &quot;استوديو Android&quot;.

من المفترض أن تتمكّن الآن من تشغيل الخدمة باستخدام "استوديو Android".

انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. بعد ذلك، انتقِل إلى الإعدادات > تسهيل الاستخدام وفعِّل خدمة شريط الإجراءات العام.

من المفترض أن تظهر لك الأزرار الأربعة التي تشكّل واجهة مستخدم الخدمة متراكبة على المحتوى المعروض على الشاشة.

overlay.png

ستضيف الآن وظائف إلى الأزرار الأربعة، حتى يتمكّن المستخدم من لمسها لتنفيذ إجراءات مفيدة.

5- ضبط زر التشغيل

أضِف طريقة configurePowerButton() إلى GlobalActionBarService.java:

private void configurePowerButton() {
   Button powerButton = (Button) mLayout.findViewById(R.id.power);
   powerButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           performGlobalAction(GLOBAL_ACTION_POWER_DIALOG);
       }
   });
}

للوصول إلى قائمة زر التشغيل، تستخدم الدالة configurePowerButton() الطريقة performGlobalAction() التي توفّرها الفئة AccessibilityService. الرمز الذي أضفته للتو بسيط: يؤدي النقر على الزر إلى تشغيل onClickListener()، ما يؤدي إلى استدعاء performGlobalAction(GLOBAL_ACTION_POWER_DIALOG) وعرض مربّع حوار الطاقة للمستخدم.

يُرجى العِلم أنّ الإجراءات العامة غير مرتبطة بأي طرق عرض. يُعدّ الضغط على زر الرجوع أو زر الشاشة الرئيسية أو زر التطبيقات المستخدَمة مؤخرًا أمثلة أخرى على الإجراءات العامة.

الآن، أضِف configurePowerButton()‎ إلى نهاية طريقة onServiceConnected()‎:

@Override
protected void onServiceConnected() {
   ...
   configurePowerButton();
}

انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. بعد ذلك، انتقِل إلى الإعدادات > تسهيل الاستخدام وابدأ خدمة شريط الإجراءات العام.

اضغط على زر التشغيل لعرض مربّع حوار التشغيل.

6. ضبط زر التحكّم بمستوى الصوت

أضِف طريقة configureVolumeButton() إلى GlobalActionBarService.java:

private void configureVolumeButton() {
   Button volumeUpButton = (Button) mLayout.findViewById(R.id.volume_up);
   volumeUpButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
           audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                   AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
       }
   });
}

تضيف الدالة configureVolumeButton() الدالة onClickListener() التي يتم تشغيلها عندما يضغط المستخدم على زر التحكّم بمستوى الصوت. داخل أداة الاستماع هذه، تستخدم الدالة configureVolumeButton() الفئة AudioManager لضبط مستوى صوت البث.

يُرجى العلم أنّه يمكن لأي شخص التحكّم في مستوى الصوت (لا تحتاج إلى أن تكون خدمة مخصّصة لتسهيل الاستخدام لإجراء ذلك).

الآن، أضِف configureVolumeButton()‎ إلى نهاية طريقة onServiceConnected()‎:

@Override
protected void onServiceConnected() {
   ...

   configureVolumeButton();
}

انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. بعد ذلك، انتقِل إلى الإعدادات > سهولة الاستخدام وابدأ خدمة شريط الإجراءات العام.

اضغط على زر التحكّم بمستوى الصوت لتغيير مستوى الصوت.

يمكن للمستخدم الافتراضي الذي لا يمكنه الوصول إلى عناصر التحكّم في مستوى الصوت على جانب الجهاز استخدام خدمة شريط الإجراءات العام لتغيير مستوى الصوت (زيادته).

7. ضبط زر التمرير

يتضمّن هذا القسم كتابة رمز لطريقتَين. تجد الطريقة الأولى عقدة قابلة للتمرير، وتنفّذ الطريقتان الثانية والثالثة إجراء التمرير نيابةً عن المستخدم.

أضِف طريقة findScrollableNode إلى GlobalActionBarService.java:

private AccessibilityNodeInfo findScrollableNode(AccessibilityNodeInfo root) {
   Deque<AccessibilityNodeInfo> deque = new ArrayDeque<>();
   deque.add(root);
   while (!deque.isEmpty()) {
       AccessibilityNodeInfo node = deque.removeFirst();
       if (node.getActionList().contains(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD)) {
           return node;
       }
       for (int i = 0; i < node.getChildCount(); i++) {
           deque.addLast(node.getChild(i));
       }
   }
   return null;
}

لا يمكن لخدمة مخصّصة لتسهيل الاستخدام الوصول إلى طرق العرض الفعلية على الشاشة. بدلاً من ذلك، يرى انعكاسًا لما يظهر على الشاشة في شكل شجرة مكوّنة من عناصر AccessibilityNodeInfo. تحتوي هذه العناصر على معلومات حول طريقة العرض التي تمثّلها (موقع طريقة العرض، وأي نص مرتبط بها، والبيانات الوصفية التي تمت إضافتها لتسهيل الاستخدام، والإجراءات التي تتيحها طريقة العرض، وما إلى ذلك). تنفّذ الطريقة findScrollableNode() عملية بحث شاملة في هذا التسلسل الشجري، بدءًا من العقدة الجذر. في حال العثور على عقدة قابلة للتمرير (أي عقدة تتوافق مع AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD)، يتم عرضها، وإلا يتم عرض القيمة null.

أضِف الآن طريقة configureScrollButton() إلى GlobalActionBarService.java:

private void configureScrollButton() {
   Button scrollButton = (Button) mLayout.findViewById(R.id.scroll);
   scrollButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           AccessibilityNodeInfo scrollable = findScrollableNode(getRootInActiveWindow());
           if (scrollable != null) {
               scrollable.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD.getId());
           }
       }
   });
}

تُنشئ هذه الطريقة onClickListener() يتم تنشيطه عند النقر على زر التمرير. يحاول العثور على عقدة قابلة للتمرير، وإذا نجح في ذلك، ينفّذ إجراء التمرير.

أضِف الآن configureScrollButton()‎ إلى onServiceConnected()‎:

@Override
protected void onServiceConnected() {
   ...

   configureScrollButton();
}

انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. بعد ذلك، انتقِل إلى الإعدادات > سهولة الاستخدام وابدأ خدمة شريط الإجراءات العام.

اضغط على زر الرجوع للانتقال إلى الإعدادات > أدوات تسهيل الاستخدام. يمكن التنقّل بين العناصر في نشاط إعدادات تسهيل الاستخدام، ويؤدي النقر على زر "التمرير" إلى تنفيذ إجراء التمرير. يمكن للمستخدم الافتراضي الذي لا يمكنه تنفيذ إجراءات التمرير بسهولة استخدام زر "التمرير" للتمرير فوق قائمة من العناصر.

8. ضبط زر التمرير السريع

أضِف طريقة configureSwipeButton() إلى GlobalActionBarService.java:

private void configureSwipeButton() {
   Button swipeButton = (Button) mLayout.findViewById(R.id.swipe);
   swipeButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           Path swipePath = new Path();
           swipePath.moveTo(1000, 1000);
           swipePath.lineTo(100, 1000);
           GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
           gestureBuilder.addStroke(new GestureDescription.StrokeDescription(swipePath, 0, 500));
           dispatchGesture(gestureBuilder.build(), null, null);
       }
   });
}

تستخدم الدالة configureSwipeButton() واجهة برمجة تطبيقات جديدة تمت إضافتها في الإصدار N وتنفِّذ الإيماءات نيابةً عن المستخدم. يستخدم الرمز عنصر GestureDescription لتحديد مسار الإيماءة المطلوب تنفيذها (يتم استخدام قيم مبرمَجة في هذا الدرس التطبيقي حول الترميز)، ثم يرسل إيماءة التمرير السريع نيابةً عن المستخدم باستخدام طريقة dispatchGesture() في AccessibilityService.

الآن، أضِف configureSwipeButton()‎ إلى onServiceConnected()‎:

@Override
protected void onServiceConnected() {
   ...
   configureSwipeButton();
}

انقر على رمز تشغيل الأخضر زر &quot;تشغيل&quot; في &quot;استوديو Android&quot; يُستخدم لتشغيل الخدمة من شريط القوائم في أعلى الشاشة. بعد ذلك، انتقِل إلى الإعدادات > سهولة الاستخدام وابدأ خدمة شريط الإجراءات العام.

أسهل طريقة لاختبار وظيفة التمرير السريع هي فتح تطبيق خرائط Google المثبَّت على هاتفك. بعد تحميل الخريطة، يؤدي النقر على الزر "التمرير السريع" إلى تمرير الشاشة سريعًا إلى اليسار.

9- ملخّص

تهانينا! لقد أنشأت خدمة مخصّصة لتسهيل الاستخدام بسيطة وعملية.

يمكنك توسيع نطاق هذه الخدمة بعدة طرق. على سبيل المثال:

  1. إتاحة إمكانية نقل شريط الإجراءات (يظهر حاليًا في أعلى الشاشة فقط)
  2. السماح للمستخدم برفع مستوى الصوت وخفضه
  3. السماح للمستخدم بالتمرير سريعًا إلى اليمين واليسار
  4. إضافة إمكانية الاستجابة لإيماءات إضافية في شريط الإجراءات

لا يغطّي هذا الدرس البرمجي إلا مجموعة فرعية صغيرة من الوظائف التي توفّرها واجهات برمجة التطبيقات الخاصة بأدوات تمكين الوصول. تتضمّن واجهة برمجة التطبيقات أيضًا ما يلي (قائمة جزئية):

  • إمكانية فتح نوافذ متعددة
  • إتاحة استخدام AccessibilityEvents عندما تتغيّر واجهة المستخدم، يتم إعلام خدمات تسهيل الاستخدام بهذه التغييرات باستخدام عناصر AccessibilityEvent. يمكن للخدمة بعد ذلك الاستجابة بشكل مناسب للتغييرات في واجهة المستخدم.
  • إمكانية التحكّم في التكبير

يساعدك هذا الدرس التطبيقي حول الترميز في البدء بكتابة خدمة مخصّصة لتسهيل الاستخدام. إذا كنت تعرف مستخدمًا يعاني من مشاكل محدّدة في إمكانية الوصول وتريد معالجتها، يمكنك الآن إنشاء خدمة لمساعدة هذا المستخدم.