การพัฒนาบริการการช่วยเหลือพิเศษสำหรับ Android

1. บทนำ

บริการการช่วยเหลือพิเศษเป็นฟีเจอร์ของเฟรมเวิร์ก Android ที่ออกแบบมาเพื่อให้ความคิดเห็นการนำทางทางเลือกให้แก่ผู้ใช้ในนามของแอปพลิเคชันที่ติดตั้งในอุปกรณ์ Android บริการการเข้าถึงสามารถสื่อสารกับผู้ใช้ในนามของแอปพลิเคชัน เช่น โดยการแปลงข้อความเป็นเสียงพูดหรือให้การตอบสนองแบบรู้สึกได้เมื่อผู้ใช้วางเมาส์เหนือบริเวณที่สำคัญของหน้าจอ Codelab นี้จะแสดงวิธีสร้างบริการการช่วยเหลือพิเศษที่ง่ายมากๆ

บริการช่วยเหลือพิเศษคืออะไร

บริการช่วยเหลือพิเศษจะช่วยผู้ใช้ที่พิการในการใช้อุปกรณ์และแอป Android เป็นบริการที่ได้รับมอบสิทธิ์มาอย่างยาวนาน ซึ่งช่วยให้ผู้ใช้ประมวลผลข้อมูลบนหน้าจอได้และช่วยให้ผู้ใช้โต้ตอบกับอุปกรณ์ได้อย่างมีความหมาย

ตัวอย่างบริการการช่วยเหลือพิเศษทั่วไป

  • การเข้าถึงด้วยสวิตช์: อนุญาตให้ผู้ใช้ Android ที่มีข้อจำกัดในการเคลื่อนไหวโต้ตอบกับอุปกรณ์ได้โดยใช้สวิตช์อย่างน้อย 1 ตัว
  • การเข้าถึงด้วยเสียง (เบต้า): ช่วยให้ผู้ใช้ Android ที่มีข้อจำกัดด้านการเคลื่อนไหวสามารถควบคุมอุปกรณ์ด้วยคำสั่งเสียงได้
  • TalkBack: โปรแกรมอ่านหน้าจอที่มักมีการใช้โดยผู้ใช้ที่มีความบกพร่องทางสายตาหรือตาบอด

การสร้างบริการการช่วยเหลือพิเศษ

แม้ว่า Google จะให้บริการต่างๆ เช่น การเข้าถึงด้วยสวิตช์ การเข้าถึงด้วยเสียง และ TalkBack สำหรับผู้ใช้ Android แต่บริการเหล่านี้อาจไม่ให้บริการผู้ใช้ทุกคนที่เป็นผู้พิการ เนื่องจากผู้ใช้ที่มีความพิการจำนวนมากมีความต้องการเฉพาะตัว API ของ Android สำหรับการสร้างบริการการช่วยเหลือพิเศษจึงเปิดกว้าง และนักพัฒนาแอปจึงสร้างบริการการช่วยเหลือพิเศษและเผยแพร่ผ่าน Play Store ได้อย่างอิสระ

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้พัฒนาบริการง่ายๆ ซึ่งมีประโยชน์ 2-3 อย่างโดยใช้ Accessibility API หากเขียนแอป Android พื้นฐานได้ คุณก็สามารถพัฒนาบริการที่คล้ายกันได้

Accessibility API มีประสิทธิภาพมาก โค้ดสำหรับบริการที่คุณจะสร้างมีเพียง 4 ไฟล์เท่านั้น และใช้โค้ดประมาณ 200 บรรทัด

ผู้ใช้ปลายทาง

คุณจะสร้างบริการสำหรับผู้ใช้สมมติโดยมีลักษณะดังต่อไปนี้

  • ผู้ใช้มีปัญหาในการใช้ปุ่มด้านข้างในอุปกรณ์
  • ผู้ใช้มีปัญหาในการเลื่อนหรือปัด

รายละเอียดบริการ

บริการจะวางซ้อนแถบการดำเนินการส่วนกลางบนหน้าจอ ผู้ใช้สามารถแตะปุ่มบนแถบนี้เพื่อดำเนินการต่อไปนี้ได้

  1. ปิดอุปกรณ์โดยไม่ให้สัมผัสกับปุ่มเปิด/ปิดจริงที่อยู่ด้านข้างโทรศัพท์
  2. ปรับระดับเสียงโดยไม่ต้องแตะปุ่มปรับระดับเสียงด้านข้างของโทรศัพท์
  3. ดำเนินการเลื่อนโดยไม่ต้องเลื่อนจริงๆ
  4. ปัดได้โดยไม่ต้องใช้ท่าทางสัมผัสการปัด

สิ่งที่คุณต้องมี

Codelab นี้จะสมมติว่าคุณจะใช้สิ่งต่อไปนี้

  1. คอมพิวเตอร์ที่ใช้ Android Studio
  2. เทอร์มินัลสำหรับเรียกใช้คำสั่ง Shell แบบง่าย
  3. อุปกรณ์ที่ใช้ Android 7.0 (Nougat) ซึ่งเชื่อมต่อกับคอมพิวเตอร์ที่คุณจะใช้การพัฒนา

มาเริ่มกันเลย

2. การตั้งค่า

ใช้เทอร์มินัลเพื่อสร้างไดเรกทอรีที่คุณใช้งาน เปลี่ยนเป็นไดเรกทอรีนี้

ดาวน์โหลดโค้ด

คุณโคลนที่เก็บที่มีโค้ดสำหรับ Codelab ได้ โดยทำดังนี้

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

ที่เก็บนี้ประกอบด้วยโปรเจ็กต์ Android Studio หลายโปรเจ็กต์ เมื่อใช้ Android Studio ให้เปิด GlobalActionBarService

เปิด Android Studio โดยคลิกไอคอน Studio ดังนี้

โลโก้ที่ใช้เปิด Android Studio

เลือกตัวเลือกนำเข้าโปรเจ็กต์ (Eclipse ADT, Gradle ฯลฯ)

หน้าจอต้อนรับสำหรับ Android Studio

ไปยังตำแหน่งที่คุณโคลนแหล่งที่มา แล้วเลือก GlobalActionBarService

จากนั้นใช้เทอร์มินัลแล้วเปลี่ยนเป็นไดเรกทอรีราก

3. ทำความเข้าใจโค้ดเริ่มต้น

สำรวจโปรเจ็กต์ที่คุณเปิด

เราได้สร้างโครงกระดูกสำหรับบริการการช่วยเหลือพิเศษให้คุณแล้ว โค้ดทั้งหมดที่คุณจะเขียนใน Codelab นี้จำกัดไว้ไม่เกิน 4 ไฟล์ต่อไปนี้

  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

ข้อมูลเกี่ยวกับบริการการช่วยเหลือพิเศษจะประกาศไว้ในไฟล์ Manifest ดังนี้

<?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>

มีการประกาศรายการที่จำเป็น 3 รายการต่อไปนี้ใน AndroidManifest.xml

  1. สิทธิ์ในการเชื่อมโยงกับบริการการช่วยเหลือพิเศษมีดังนี้
<service
    ...
    android:permission = "android.permission.BIND_ACCESSIBILITY_SERVICE">
    ...             
</service>
  1. Intent ของ 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" />

การใช้องค์ประกอบ &lt;accessibility-service&gt; จะได้รับการกำหนดข้อมูลเมตาต่อไปนี้

  1. ประเภทความคิดเห็นสำหรับบริการนี้ (Codelab นี้ใช้ feedbackgeneric ซึ่งเป็นค่าเริ่มต้นที่ดี)
  2. แฟล็กการช่วยเหลือพิเศษสำหรับบริการ (Codelab นี้ใช้แฟล็กเริ่มต้น)
  3. ความสามารถที่จำเป็นสำหรับบริการมีดังนี้
  4. หากต้องการเลื่อน ตั้งค่า android:canPerformGestures เป็น true
  5. หากต้องการดึงเนื้อหาหน้าต่าง android:canRetrieveWindowContent จะตั้งเป็น true

GlobalActionBarService.java

รหัสส่วนใหญ่สำหรับบริการการช่วยเหลือพิเศษจะอยู่ใน GlobalActionBarService.java โดยในขั้นต้น ไฟล์จะมีโค้ดขั้นต่ำสัมบูรณ์สำหรับบริการการช่วยเหลือพิเศษดังนี้

  1. คลาสที่ขยาย AccessibilityService
  2. เมธอดที่มีการลบล้างที่จำเป็น 2 วิธี (เว้นว่างไว้ใน Codelab นี้)
public class GlobalActionBarService extends AccessibilityService {

   @Override
   public void onAccessibilityEvent(AccessibilityEvent event) {

   }

   @Override
   public void onInterrupt() {

   }
}

คุณจะเพิ่มโค้ดลงในไฟล์นี้ระหว่าง Codelab

action_bar.xml

บริการแสดง UI ที่มี 4 ปุ่ม และไฟล์เลย์เอาต์ 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 ว่างเปล่า คุณจะเพิ่มมาร์กอัปสำหรับปุ่มต่างๆ ในระหว่าง Codelab

การเปิดใช้งานแอปพลิเคชัน

ตรวจสอบว่าอุปกรณ์เชื่อมต่อกับคอมพิวเตอร์แล้ว แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ ซึ่งจะเป็นการเปิดแอปที่คุณกำลังใช้อยู่

ไปที่การตั้งค่า > การช่วยเหลือพิเศษ ติดตั้งบริการแถบการทำงานส่วนกลางในอุปกรณ์แล้ว

หน้าจอการตั้งค่าการช่วยเหลือพิเศษ

คลิก 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 ได้ คุณต้องตรวจสอบว่าการตั้งค่า Run ได้รับการกำหนดค่าอย่างถูกต้อง

แก้ไขการกำหนดค่า Run ของคุณ (ใช้ Run จากเมนูด้านบนและไปที่ Edit Configurations จากนั้นเปลี่ยนตัวเลือกการเปิดจาก "กิจกรรมเริ่มต้น" เมื่อใช้เมนูแบบเลื่อนลง เป็น "ไม่มีสิ่งใด"

เมนูแบบเลื่อนลงเพื่อกำหนดการตั้งค่าการเรียกใช้เพื่อเปิดใช้บริการโดยใช้ Android Studio

คุณควรสามารถเปิดบริการโดยใช้ Android Studio ได้แล้ว

แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเปิด Global Action Bar Service

คุณจะเห็นปุ่ม 4 ปุ่มที่เป็น UI ของบริการวางซ้อนอยู่บนเนื้อหาที่แสดงบนหน้าจอ

overlay.png

ตอนนี้คุณเพิ่มฟังก์ชันการทำงานให้กับปุ่มทั้ง 4 ปุ่ม เพื่อให้ผู้ใช้แตะปุ่มดังกล่าวเพื่อดำเนินการต่างๆ ที่เป็นประโยชน์ได้

5. การกำหนดค่าปุ่มเปิด/ปิด

เพิ่มเมธอด configurePowerButton() ใน configurePowerButton():

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() ต่อท้ายเมธอด configurePowerButton() ดังนี้

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

แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ และเริ่ม Global Action Bar Service

กดปุ่มเปิด/ปิดเพื่อแสดงกล่องโต้ตอบเปิด/ปิด

6. การกำหนดค่าปุ่มปรับระดับเสียง

เพิ่มเมธอด configureVolumeButton() ลงใน configureVolumeButton() ดังนี้

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() ที่ทริกเกอร์เมื่อผู้ใช้กดปุ่มปรับระดับเสียง ใน Listener นี้ configureVolumeButton() ใช้ AudioManager เพื่อปรับระดับเสียงของสตรีม

โปรดทราบว่าทุกคนควบคุมระดับเสียงได้ (คุณไม่จำเป็นต้องเป็นบริการการช่วยเหลือพิเศษจึงจะดำเนินการนี้ได้)

ตอนนี้ให้เพิ่ม configureVolumeButton() ต่อท้ายเมธอด configureVolumeButton() ดังนี้

@Override
protected void onServiceConnected() {
   ...

   configureVolumeButton();
}

แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การเข้าถึง และเริ่ม Global Action Bar Service

กดปุ่มปรับระดับเสียงเพื่อเปลี่ยนระดับเสียง

ตอนนี้ผู้ใช้สมมติที่ไม่สามารถเข้าถึงตัวควบคุมระดับเสียงที่ด้านข้างของอุปกรณ์สามารถใช้ Global Action Bar Service เพื่อเปลี่ยน (เพิ่ม) ระดับเสียงได้

7. การกำหนดค่าปุ่มเลื่อน

ส่วนนี้เกี่ยวข้องกับการเขียนโค้ด 2 วิธี วิธีแรกจะค้นหาโหนดที่เลื่อนได้ และวิธีที่ 2 จะดำเนินการเลื่อนในนามของผู้ใช้

เพิ่มเมธอด findScrollableNode ไปยัง findScrollableNode

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() ใน configureScrollButton()

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() ลงใน configureScrollButton() ดังนี้

@Override
protected void onServiceConnected() {
   ...

   configureScrollButton();
}

แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การเข้าถึง และเริ่ม Global Action Bar Service

กดปุ่มย้อนกลับเพื่อไปที่การตั้งค่า > การช่วยเหลือพิเศษ รายการต่างๆ ในกิจกรรมการตั้งค่าการช่วยเหลือพิเศษสามารถเลื่อนได้ และการแตะที่ปุ่มเลื่อนจะเป็นการเลื่อน ตอนนี้ผู้ใช้สมมติของเราที่ไม่สามารถเลื่อนดูรายการต่างๆ ได้โดยง่าย สามารถใช้ปุ่มเลื่อนเพื่อเลื่อนดูรายการได้

8. การกำหนดค่าปุ่มเลื่อน

เพิ่มเมธอด configureSwipeButton() ใน configureSwipeButton()

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() ใช้ API ใหม่ที่เพิ่มใน N ซึ่งทำท่าทางสัมผัสในนามของผู้ใช้ โค้ดจะใช้ออบเจ็กต์ GestureDescription เพื่อระบุเส้นทางสำหรับท่าทางสัมผัสที่จะทำ (มีการใช้ค่าแบบฮาร์ดโค้ดใน Codelab นี้) จากนั้นจะส่งท่าทางสัมผัสการปัดในนามของผู้ใช้โดยใช้เมธอด AccessibilityService dispatchGesture()

ตอนนี้ให้เพิ่ม configureSwipeButton() ไปยัง configureSwipeButton() ดังนี้

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

แตะไอคอนเล่นสีเขียว ปุ่ม &quot;เล่น&quot; ของ Android Studio ที่ใช้เพื่อเปิดใช้บริการ จากแถบเมนูที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การเข้าถึง และเริ่ม Global Action Bar Service

วิธีที่ง่ายที่สุดในการทดสอบฟังก์ชันการปัดหน้าจอคือให้เปิดแอปพลิเคชัน Maps ที่ติดตั้งในโทรศัพท์ เมื่อแผนที่โหลดขึ้นมา การแตะปุ่ม "ปัด" จะปัดหน้าจอไปทางขวา

9. สรุป

ยินดีด้วย คุณได้สร้างบริการการช่วยเหลือพิเศษที่เรียบง่ายและใช้งานได้แล้ว

คุณสามารถขยายบริการนี้ได้หลายวิธี เช่น

  1. ทำให้แถบการทำงานขยับได้ (ตอนนี้อยู่ที่ด้านบนสุดของหน้าจอ)
  2. อนุญาตให้ผู้ใช้เพิ่มและลดระดับเสียง
  3. อนุญาตให้ผู้ใช้ปัดได้ทั้งซ้ายและขวา
  4. เพิ่มการรองรับท่าทางสัมผัสเพิ่มเติมที่แถบการทำงานสามารถตอบสนองได้

Codelab นี้ครอบคลุมฟังก์ชันการทำงานเพียงบางส่วนที่ API การช่วยเหลือพิเศษให้บริการ นอกจากนี้ API ยังครอบคลุมสิ่งต่อไปนี้ (บางส่วน)

  • รองรับหลายหน้าต่าง
  • การรองรับ AccessibilityEvent เมื่อ UI มีการเปลี่ยนแปลง บริการการช่วยเหลือพิเศษจะได้รับแจ้งเกี่ยวกับการเปลี่ยนแปลงเหล่านั้นโดยใช้ออบเจ็กต์ AccessibilityEvent จากนั้นบริการจะตอบสนองต่อการเปลี่ยนแปลง UI ตามความเหมาะสม
  • ความสามารถในการควบคุมการขยาย

Codelab นี้ช่วยให้คุณเริ่มต้นเขียนบริการการช่วยเหลือพิเศษได้ หากคุณรู้จักผู้ใช้ที่มีปัญหาด้านความสามารถเข้าถึงได้ง่ายบางอย่างที่คุณต้องการแก้ไข คุณสามารถสร้างบริการเพื่อช่วยเหลือผู้ใช้รายนั้นได้แล้ว