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 บรรทัด
ผู้ใช้ปลายทาง
คุณจะสร้างบริการสำหรับผู้ใช้สมมติที่มีลักษณะต่อไปนี้
- ผู้ใช้ประสบปัญหาในการเอื้อมไปกดปุ่มด้านข้างของอุปกรณ์
- ผู้ใช้มีปัญหาในการเลื่อนหรือปัด
รายละเอียดบริการ
บริการของคุณจะวางซ้อนแถบการทำงานส่วนกลางบนหน้าจอ ผู้ใช้สามารถแตะปุ่มในแถบนี้เพื่อดำเนินการต่อไปนี้
- ปิดอุปกรณ์โดยไม่ต้องกดปุ่มเปิด/ปิดจริงที่ด้านข้างของโทรศัพท์
- ปรับระดับเสียงโดยไม่ต้องแตะปุ่มปรับระดับเสียงที่ด้านข้างของโทรศัพท์
- ดำเนินการเลื่อนโดยไม่ต้องเลื่อนจริง
- ปัดโดยไม่ต้องใช้ท่าทางสัมผัสการปัด
สิ่งที่คุณต้องมี
Codelab นี้ถือว่าคุณจะใช้สิ่งต่อไปนี้
- คอมพิวเตอร์ที่ใช้ Android Studio
- เทอร์มินัลสำหรับเรียกใช้คำสั่ง Shell อย่างง่าย
- อุปกรณ์ที่ใช้ Android 7.0 (Nougat) ซึ่งเชื่อมต่อกับคอมพิวเตอร์ที่คุณจะใช้ในการพัฒนา
มาเริ่มกันเลย
2. การเริ่มตั้งค่า
สร้างไดเรกทอรีที่คุณจะใช้ทำงานโดยใช้เทอร์มินัล เปลี่ยนเป็นไดเรกทอรีนี้
ดาวน์โหลดโค้ด
คุณสามารถโคลนที่เก็บที่มีโค้ดสำหรับ Codelab นี้ได้โดยทำดังนี้
git clone https://github.com/android/codelab-android-accessibility.git
โดยที่รีโปมีโปรเจ็กต์ Android Studio หลายรายการ เปิด GlobalActionBarService โดยใช้ Android Studio
เปิด Android Studio โดยคลิกไอคอน Studio

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

ไปที่ตำแหน่งที่โคลนแหล่งที่มา แล้วเลือก GlobalActionBarService
จากนั้นใช้เทอร์มินัลเพื่อเปลี่ยนเป็นไดเรกทอรีราก
3. ทำความเข้าใจโค้ดเริ่มต้น
สำรวจโปรเจ็กต์ที่คุณเปิด
เราได้สร้างโครงร่างพื้นฐานสำหรับบริการการช่วยเหลือพิเศษให้คุณแล้ว โค้ดทั้งหมดที่คุณจะเขียนในโค้ดแล็บนี้จะจำกัดไว้ในไฟล์ 4 ไฟล์ต่อไปนี้
- app/src/main/AndroidManifest.xml
- app/src/main/res/layout/action_bar.xml
- app/src/main/res/xml/global_action_bar_service.xml
- 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
- สิทธิ์ในการเชื่อมโยงกับบริการการช่วยเหลือพิเศษ
<service
...
android:permission = "android.permission.BIND_ACCESSIBILITY_SERVICE">
...
</service>
- Intent AccessibilityService
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
- ตำแหน่งของไฟล์ที่มีข้อมูลเมตาสำหรับบริการที่คุณสร้าง
<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>
- ประเภทความคิดเห็นสำหรับบริการนี้ (Codelab นี้ใช้ feedbackGeneric ซึ่งเป็นค่าเริ่มต้นที่ดี)
- ฟีเจอร์การช่วยเหลือพิเศษสำหรับบริการ (Codelab นี้ใช้ฟีเจอร์เริ่มต้น)
- ความสามารถที่จำเป็นสำหรับบริการมีดังนี้
- หากต้องการปัด ให้ตั้งค่า android:canPerformGestures เป็น true
- หากต้องการเรียกข้อมูลเนื้อหาของหน้าต่าง ให้ตั้งค่า android:canRetrieveWindowContent เป็น true
GlobalActionBarService.java
โค้ดส่วนใหญ่สำหรับบริการช่วยเหลือพิเศษจะอยู่ใน GlobalActionBarService.java ในตอนแรก ไฟล์จะมีโค้ดขั้นต่ำที่สุดสำหรับบริการเพื่อการช่วยเหลือพิเศษ ดังนี้
- คลาสที่ขยาย AccessibilityService
- เมธอดที่ต้องแทนที่ 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
การเปิดแอปพลิเคชัน
ตรวจสอบว่าอุปกรณ์เชื่อมต่อกับคอมพิวเตอร์แล้ว กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ ซึ่งควรจะเปิดแอปที่คุณกำลังทำงานอยู่
ไปที่การตั้งค่า > การช่วยเหลือพิเศษ 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 ได้แล้ว
กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเปิดบริการแถบการทำงานส่วนกลาง
คุณควรเห็นปุ่ม 4 ปุ่มที่ประกอบกันเป็น UI ของบริการซ้อนทับอยู่ด้านบนของเนื้อหาที่แสดงบนหน้าจอ

ตอนนี้คุณจะเพิ่มฟังก์ชันการทำงานให้กับปุ่มทั้ง 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();
}
กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเริ่มบริการแถบการทำงานส่วนกลาง
กดปุ่มเปิด/ปิดเพื่อแสดงกล่องโต้ตอบการเปิด/ปิด
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();
}
กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเริ่มบริการแถบการทำงานส่วนกลาง
กดปุ่มปรับระดับเสียงเพื่อเปลี่ยนระดับเสียง
ตอนนี้ผู้ใช้สมมติที่เข้าถึงตัวควบคุมระดับเสียงที่ด้านข้างของอุปกรณ์ไม่ได้จะใช้บริการแถบการทำงานส่วนกลางเพื่อเปลี่ยน (เพิ่ม) ระดับเสียงได้แล้ว
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();
}
กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเริ่มบริการแถบการทำงานส่วนกลาง
กดปุ่มกลับเพื่อไปที่การตั้งค่า > การช่วยเหลือพิเศษ รายการในการตั้งค่าการช่วยเหลือพิเศษสามารถเลื่อนได้ และการแตะปุ่มเลื่อนจะทำให้เกิดการเลื่อน ตอนนี้ผู้ใช้สมมติของเราที่ไม่สามารถเลื่อนได้ง่ายๆ สามารถใช้ปุ่มเลื่อนเพื่อเลื่อนรายการได้แล้ว
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();
}
กดไอคอนเล่นสีเขียว
จากแถบเมนูไปที่ด้านบนของหน้าจอ จากนั้นไปที่การตั้งค่า > การช่วยเหลือพิเศษ แล้วเริ่มบริการแถบการทำงานส่วนกลาง
วิธีที่ง่ายที่สุดในการทดสอบฟังก์ชันการปัดคือการเปิดแอปพลิเคชัน Maps ที่ติดตั้งในโทรศัพท์ เมื่อแผนที่โหลดแล้ว การแตะปุ่มปัดจะเป็นการปัดหน้าจอไปทางขวา
9. สรุป
ยินดีด้วย คุณได้สร้างบริการการช่วยเหลือพิเศษที่ใช้งานได้จริงและเรียบง่าย
คุณขยายเวลาการใช้บริการนี้ได้หลายวิธี เช่น
- ทำให้แถบการทำงานเคลื่อนย้ายได้ (ตอนนี้แถบการทำงานจะอยู่ด้านบนของหน้าจอ)
- อนุญาตให้ผู้ใช้เพิ่มและลดระดับเสียง
- อนุญาตให้ผู้ใช้ปัดทั้งซ้ายและขวา
- เพิ่มการรองรับท่าทางสัมผัสเพิ่มเติมที่แถบการดำเนินการตอบสนองได้
Codelab นี้ครอบคลุมเฉพาะฟังก์ชันย่อยเล็กๆ ที่ API การช่วยเหลือพิเศษมีให้ นอกจากนี้ API ยังครอบคลุมถึงสิ่งต่อไปนี้ (รายการบางส่วน)
- รองรับหลายหน้าต่าง
- รองรับ AccessibilityEvent เมื่อ UI เปลี่ยนแปลง ระบบจะแจ้งให้บริการการช่วยเหลือพิเศษทราบเกี่ยวกับการเปลี่ยนแปลงเหล่านั้นโดยใช้ออบเจ็กต์ AccessibilityEvent จากนั้นบริการจะตอบกลับการเปลี่ยนแปลง UI ได้ตามความเหมาะสม
- ความสามารถในการควบคุมการขยาย
Codelab นี้จะช่วยให้คุณเริ่มต้นเขียนบริการการช่วยเหลือพิเศษ หากทราบว่าผู้ใช้มีปัญหาด้านการช่วยเหลือพิเศษที่เฉพาะเจาะจงซึ่งคุณต้องการแก้ไข ตอนนี้คุณสามารถสร้างบริการเพื่อช่วยเหลือผู้ใช้รายนั้นได้แล้ว