標簽元素
向用戶提供解釋每個可互動元素的意義和目的有用且形象的標簽是非常重要的。這些標簽允許屏幕閱讀者(比如 TalkBack )正確向用戶解釋每個控制器的功能。
你可以使用一下兩個方法提供元素的標簽:
當展示在 Activity 的整個生命周期中都不會改變樣式的靜態元素時,在 layout 資源文件中添加一個 xml 元素。
當展示在 Activity 生命周期中會改變樣式的動態元素時,在改變元素樣式的動態邏輯中設置元素標簽。
適用于元素標簽的實際屬性和方法取決于元素的類型:
圖形元素,比如 ImageView , ImageButton ,使用 android:contentDescription XML 屬性設置靜態元素 或 setContentDescription() 方法設置動態元素。
對于簡單裝飾的圖形元素,設置各自的 android:contentDescription XML 屬性為 “@null”。如果你的應用只支持 Android 4.1 及以上的設備,你可以設置 Android:isImportantForAccessibility XML 元素為 “no”。
可編輯元素,比如 EditText , 使用hint XML屬性設置靜態元素或 setHint() 方法設置動態屬性。
如果你的應用在 Android 4.2 及以上的設備上安裝,對于充當正文標簽的 View 對象,使用 android:labelFor 屬性。
Accessibility 服務自動捕獲 TextView 中的文字,所以你通常不需要標記這些元素
以下示例中,提供分享功能的靜態 ImageButton 對象使用一個 “share” 標簽:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:contentDescription="@string/share"
android:src="@drawable/ic_share" />
許多 Accessibility 服務,比如 TalkBack , BrailleBack ,在聲明標簽后自動聲明元素類型,所以你不應改在標簽中包括元素類型。
以下例子展示了如何在 Activity 中更新一個顯示播放或暫停按鈕的動態的 ImageView 對象:
ImageView playPauseImageView = new ImageView();
boolean mediaCurrentlyPlaying = true;
...
private void updateImageButton() {
if (mediaCurrentlyPlaying) {
playPauseImageView.setImageResource(R.drawable.ic_pause);
// In res/values/strings.xml, "pause" contains a value of "Pause".
playPauseImageView.setContentDescription(getString(R.string.pause));
} else {
playPauseImageView.setImageResource(R.drawable.ic_play);
// In res/values/strings.xml, "play" contains a value of "Play".
playPauseImageView.setContentDescription(getString(R.string.play));
}
}
翻譯到這里發現并沒有什么用==以下翻譯內容才是我想要的
建立一個 Accessibility Service
Manifest 聲明和權限
提供 Accessibility Services 的應用必須在應用的 mainfest 文件中包括制定的聲明告訴系統這是個 Accessibility Services 。
Accessibility Service 聲明
為了適配 Android 4.1 及以上設備, mainfest 文件必須通過添加 BIND_ACCESSIBILITY_SERVICE 權限包含一個 Accessibility Services 的意圖過濾器保證只有系統可以綁定。
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label">
這些聲明在 Android 1.6 及以上都需要。
Accessibility Service 配置
Accessibility Services 必須提供指定服務處理處理事件的類型和服務額外信息的配置。這個配置被包含在 AccessibilityServiceInfo 類中。你的服務可以在運行時通過生成實例類并使用 setServiceInfo() 配置信息。但是不是所有的配置選項都可以通過這個方法配置。
Android 4.0 開始,你可以個通過 元素引用一個可以設置服務全部選項的配置文件:
...
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
xml :
android:description="@string/accessibility_service_description"
android:packageNames="com.example.android.apis"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
/>
注冊 Accessibility 事件
服務配置參數一個最重要的功能就是制定你的服務可以處理何種事件。制定服務信息可以是服務相互合作,并允許開發者靈活的制定應用和事件類型:
包名: 指定服務想要處理的應用包名。如果這個參數被省略,你的服務將被認為處理所有應用的事件。這個參數可以通過配置文件的 android:packageNames 設置以逗號分隔的列表,或者使用 AccessibilityServiceInfo.packagenames 設置。
事件類型:指定服務處理事件的類型。這個參數可以通過配置文件中的 android:accessibilityEventTypes 設置以 | 為分隔的list ,或者使用 AccessibilityServiceInfo.eventTypes 設置。
Accessibility Services 方法
onServiceConnected() - (可選) 當系統連接服務成功時回調。使用這個方法完成服務的一次性操作,包括連接用戶反饋系統服務,比如音頻管理器或者震動器。如果你想在運行時修改服務配置或者進行調整,在這個地方使用 serServiceInfo() 方法。
onAccessibilityEvent() -(必選)當服務檢測到一個 Accessibility 事件滿足了之前你設置的服務類型,系統將會回調此方法。比如,當用戶點擊一個按鈕或者聚焦在 UI 界面時。當這發生時,系統調用這個方法,通過 AccessibilityEvent() 向用戶提供反饋。這個方法在整個生命周期中可以被多次調用。
onInterrupt() -(必選) 當系統想要中斷服務提供的反饋,通常時作為用戶的操作的回應比如移動焦點時調用這個方法。這個方法將在生命周期期間多次調用。
onUnbind() - (可選) 系統將要關閉服務時調用方法。使用這個方法做一些關閉程序,包括釋放用戶反饋系統服務,比如音頻管理器或者振動器。
獲取事件細節
AccessibilityEvent.getRecordCount() and getRecord(int) - 這些方法允許你取回 AccessibilityRecord 對象的 set 列表。
AccessibilityEvent.getSource() - 這個方法返回一個 AccessibilityNodeInfo 對象。這個對象可以獲得 View 的布局層次(父布局和子布局)。因此,服務必須通過在配置 XML 文件中添加 canRetrieveWindowContent 屬性為 true 來獲取權限。否則調用失敗。
為用戶采取操作
監聽手勢
在Android 4.1 以后可以監聽指定手勢。這個特性需要設置 AccessibilityServiceInfo 的flags 為 FLAG_REQUEST_TOUCH_EXPLORATION_MODE:
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onCreate() {
getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
}
...
}
使用可訪問行動
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// get the source node of the event
AccessibilityNodeInfo nodeInfo = event.getSource();
// Use the event and node information to determine
// what action to take
// take action on behalf of the user
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
// recycle the nodeInfo object
nodeInfo.recycle();
}
...
}
performAction() 方法允許你在應用中采取行動。如果需要采取一個全局行動,比如返回值 Home 屏,按下返回按鈕,打開通知屏或最近應用列表,使用 performGlobalAction() 方法。
使用焦點類型