คู่มือนี้จะให้แนวทางปฏิบัติแนะนำสำหรับการช่วยเหลือพิเศษใน Android TV และให้ คำแนะนำสำหรับทั้งแอปที่มาพร้อมเครื่องและแอปที่ไม่ได้มาพร้อมเครื่อง
เหตุใดการช่วยเหลือพิเศษจึงสำคัญต่อแอป TV ของฉัน
ความบกพร่องทางสายตาเป็นสิ่งที่พบได้บ่อยในหมู่ผู้ชมทีวี WHO ประมาณการว่าประชากรทั่วโลก 2.2 พันล้านคนมีปัญหาด้านการมองเห็น ขณะที่ผู้ใหญ่ในสหรัฐอเมริกาประมาณ 32 ล้านคนมีปัญหาด้านการมองเห็นอย่างมาก (การสำรวจสัมภาษณ์ด้านสุขภาพแห่งชาติปี 2018) ในยุโรป EBU ประมาณการว่ามีผู้ได้รับผลกระทบ 30 ล้านคน
ผู้ใช้ที่มีความบกพร่องทางสายตาสามารถเพลิดเพลินกับสื่อได้มากเท่ากับเพื่อนร่วมงานที่มีสายตาปกติ แบบสำรวจปี 2017 ของ Comcast พบว่า 96% ดูทีวี (81% ดูนานกว่า 1 ชั่วโมงต่อวัน) แต่ 65% รายงานปัญหา เกี่ยวกับการค้นหาเนื้อหา นอกจากนี้ ผู้พิการ 80% ในแบบสำรวจของสหราชอาณาจักรรายงานว่าพบปัญหาในการสตรีม
เทคโนโลยีความช่วยเหลือพิเศษช่วยได้ แต่แอปทีวีต้องรองรับการช่วยเหลือพิเศษในการค้นพบเนื้อหา โปรดให้ความสนใจเป็นพิเศษกับคำแนะนำการนำทางและป้ายกำกับองค์ประกอบ ตรวจสอบความเข้ากันได้กับฟีเจอร์ต่างๆ เช่น TalkBack เพื่อปรับปรุงประสบการณ์การใช้งานสำหรับผู้ใช้ที่มีความบกพร่องทางสายตาได้อย่างมาก
ก้าวแรกในการปรับปรุงการช่วยเหลือพิเศษคือการตระหนักถึงความสำคัญ คู่มือนี้จะช่วย คุณและทีมค้นพบปัญหาด้านการช่วยเหลือพิเศษในแอป TV
แหล่งข้อมูลการช่วยเหลือพิเศษของ Android
ดูข้อมูลเพิ่มเติมเกี่ยวกับการช่วยเหลือพิเศษใน Android ได้ที่แหล่งข้อมูลการพัฒนาการช่วยเหลือพิเศษ
อัตราส่วนข้อความ
แอป Android TV ควรปฏิบัติตามค่ากำหนดของผู้ใช้ในการปรับขนาดข้อความโดยรองรับความหนาแน่นของพิกเซลที่แตกต่างกัน
โปรดระมัดระวังเป็นพิเศษในเรื่องต่อไปนี้
- ใช้
wrap_contentสำหรับมิติข้อมูลในคอมโพเนนต์ UI - ตรวจสอบว่าเลย์เอาต์จะจัดเรียงคอมโพเนนต์ใหม่เมื่อขนาดของคอมโพเนนต์เปลี่ยนแปลง โดยขึ้นอยู่กับขนาดข้อความ
- ตรวจสอบว่าคอมโพเนนต์ยังคงพอดีกับหน้าจอเมื่อปรับขนาดข้อความให้ใหญ่ขึ้น
- อย่าใช้หน่วยขนาดข้อความ sp กับคอมโพเนนต์ที่ไม่ยืดหยุ่น
ตรวจสอบค่าของ
FONT_SCALEเพื่อการปรับในมุมมองที่กำหนดเอง// Checking font scale with Context val scale = resources.configuration.fontScale Log.d(TAG, "Text scale is: " + scale)
คุณเปลี่ยนขนาดข้อความได้ด้วยคำสั่งต่อไปนี้
adb shell settings put system font_scale 1.2f
ใน Android 12 ขึ้นไป ผู้ใช้สามารถเปลี่ยนการปรับขนาดข้อความจากการตั้งค่าอุปกรณ์ได้
รูปแบบแป้นพิมพ์
ใน Android 13 (API ระดับ 33) ขึ้นไป คุณสามารถใช้
getKeyCodeForKeyLocation()
เพื่อ
ค้นหารหัสคีย์สำหรับ
ตำแหน่งคีย์ที่คาดไว้
ซึ่งอาจจำเป็นในกรณีที่ผู้ใช้ได้แมปตำแหน่งคีย์บางตำแหน่งใหม่ หรือหากผู้ใช้กำลังใช้แป้นพิมพ์ที่มีเลย์เอาต์ไม่ปกติ
เสียงบรรยาย
ใน Android 13 (ระดับ API 33) ขึ้นไป ค่ากำหนดการช่วยเหลือพิเศษใหม่ทั้งระบบ ช่วยให้ผู้ใช้เปิดใช้เสียงบรรยายในทุกแอปได้ แอป Android TV
สามารถตรวจสอบค่ากำหนดของผู้ใช้ได้โดยการค้นหาด้วย
isAudioDescriptionRequested()
Kotlin
private lateinit var accessibilityManager: AccessibilityManager
// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)
// Where your media player is initialized
if (am.isAudioDescriptionRequested) {
// User has requested to enable audio descriptions
}
Java
private AccessibilityManager accessibilityManager;
// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager.class);
// Where your media player is initialized
if(accessibilityManager.isAudioDescriptionRequested()) {
// User has requested to enable audio descriptions
}
แอป Android TV สามารถตรวจสอบได้เมื่อค่ากำหนดของผู้ใช้เปลี่ยนแปลงโดย
เพิ่ม Listener ไปยัง
AccessibilityManager
Kotlin
private val listener =
AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
// Preference changed; reflect its state in your media player
}
override fun onStart() {
super.onStart()
accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}
override fun onStop() {
super.onStop()
accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}
Java
private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> {
// Preference changed; reflect its state in your media player
};
@Override
protected void onStart() {
super.onStart();
accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener);
}
@Override
protected void onStop() {
super.onStop();
accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener);
}