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

1. บทนำ

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

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

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

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

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

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

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

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

ในโค้ดแล็บนี้ คุณจะได้พัฒนาบริการอย่างง่ายที่ทำสิ่งที่มีประโยชน์ 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 หลายรายการ เปิด GlobalActionBarService โดยใช้ Android Studio

เปิด Android Studio โดยคลิกไอคอน Studio

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

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

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

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

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

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

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

เราได้สร้างโครงร่างพื้นฐานสำหรับบริการการช่วยเหลือพิเศษให้คุณแล้ว โค้ดทั้งหมดที่คุณจะเขียนในโค้ดแล็บนี้จะจำกัดไว้ในไฟล์ 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" />

ระบบได้กำหนดข้อมูลเมตาต่อไปนี้โดยใช้องค์ประกอบ <accessibility-service>

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

GlobalActionBarService.java

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

  1. คลาสที่ขยาย AccessibilityService
  2. เมธอดที่ต้องแทนที่ 2-3 รายการ (เว้นว่างไว้ในโค้ดแล็บนี้)
public class GlobalActionBarService extends AccessibilityService {

   @Override
   public void onAccessibilityEvent(AccessibilityEvent event) {

   }

   @Override
   public void onInterrupt() {

   }
}

คุณจะเพิ่มโค้ดลงในไฟล์นี้ในระหว่างการทำโค้ดแล็บ

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

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

ตรวจสอบว่าอุปกรณ์เชื่อมต่อกับคอมพิวเตอร์แล้ว กดไอคอนเล่นสีเขียว ปุ่มเล่นใน 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 คุณต้องตรวจสอบว่าได้กำหนดค่าการตั้งค่าการเรียกใช้ถูกต้องแล้ว

แก้ไขการกำหนดค่าการเรียกใช้ (ใช้ "เรียกใช้" จากเมนูด้านบน แล้วไปที่ "แก้ไขการกำหนดค่า") จากนั้นใช้เมนูแบบเลื่อนลงเพื่อเปลี่ยนตัวเลือกการเปิดใช้จาก "กิจกรรมเริ่มต้น" เป็น "ไม่มี"

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

ตอนนี้คุณควรจะเปิดใช้บริการโดยใช้ Android Studio ได้แล้ว

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

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

overlay.png

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

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();
}

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

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

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

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

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

@Override
protected void onServiceConnected() {
   ...

   configureVolumeButton();
}

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

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

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

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

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

เพิ่มเมธอด 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();
}

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

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

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

ตอนนี้ให้เพิ่ม configureSwipeButton() ลงใน onServiceConnected() ดังนี้

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

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

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

9. สรุป

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

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

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

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

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

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