• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

浅谈辅助功效 AccessibilityService

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0620/547.html

 
对于那些因为目力、听力或其它身材缘故招致不行利便应用Android智能手机的用户,Android提供了Accessibility功效和服无赞助这些用户加倍简单地操纵建筑,包孕文字转语音(不支持中文)、触觉反应、手势操纵、轨迹球和手柄操纵。
 
辅助功效定义
 
对于那些因为目力、听力或其它身材缘故招致不行利便应用Android智能手机的用户,Android提供了Accessibility功效和服无赞助这些用户加倍简单地操纵建筑,包孕文字转语音(不支持中文)、触觉反应、手势操纵、轨迹球和手柄操纵。开发者可以搭建本人的Accessibility服无,这可以增强可用性,比方声响提醒,物理反应,和其余可选的操纵形式。
 
跟着Android版本的接续晋级,AndroidAccessibility功效也越来越壮大,Android 4.0版本过去,体系辅助服无功效对照单纯,仅仅能过单向获取窗口元素信息,好比获取输入框用户输入内容。到Android 4.1版本以后,体系辅助服无增加了与窗口元素的双向交互,此时可以通过辅助功效服无操纵窗口元素,好比点击按钮等。
 
现实辅助功效筹办事情
 
1、新建本人的AccessibilityService类
 
想要让本人程序实辅助功效,起首第一步即是要新建类并秉承AccessibilityService类。秉承自AccessibilityService的子类里实现几个紧张的重载要领:
 
要领
 
形貌
 
onAccessibilityEvent()
 
必需。通过这个函数可以汲取体系发送来的AccessibilityEvent,汲取来的AccessibilityEvent是经过过滤的,过滤是在配置事情时配置的。
 
onInterrupt()
 
必需。这个在体系想要中缀AccessibilityService返给的响应时会挪用。在全部性命周期里会被挪用屡次。
 
onServiceConnected()
 
可选。在体系胜利持续上这个AccessibilityService会挪用。在这个要领里你可以做一下初始化事情。
 
onUnbind()
 
可选。在体系将要关闭这个AccessibilityService会被挪用。在这个要领中进行少许释放资源的事情。
 
2、新建AccessibilityService配置文件
 
 
 
属性分别代表意思:
 
属性
 
形貌
 
description
 
即是配置里辅助功效项的备注申明(不行在运转时点窜)。
 
accessibilityEventTypes
 
配置响应事件的范例,typeAllMask固然即是响应所有范例的事件了。固然另有单击、长按、滑动等(多个值由“|”分开)(可在运转时点窜)。
 
值有:
 
 
申明
 
typeViewClicked
 
Receives TYPE_VIEW_CLICKED     events.
 
typeViewLongClicked
 
Receives TYPE_VIEW_LONG_CLICKED     events.
 
typeViewSelected
 
Receives TYPE_VIEW_SELECTED     events.
 
typeViewFocused
 
Receives TYPE_VIEW_FOCUSED     events.
 
typeViewTextChanged
 
Receives TYPE_VIEW_TEXT_CHANGED     events.
 
typeWindowStateChanged
 
Receives     TYPE_WINDOW_STATE_CHANGED events.
 
typeNotificationStateChanged
 
Receives     TYPE_NOTIFICATION_STATE_CHANGED events.
 
typeViewHoverEnter
 
Receives TYPE_VIEW_HOVER_ENTER     events.
 
typeViewHoverExit
 
Receives TYPE_VIEW_HOVER_EXIT     events.
 
typeTouchExplorationGestureStart
 
Receives     TYPE_TOUCH_EXPLORATION_GESTURE_START events.
 
typeTouchExplorationGestureEnd
 
Receives     TYPE_TOUCH_EXPLORATION_GESTURE_END events.
 
typeWindowContentChanged
 
Receives     TYPE_WINDOW_CONTENT_CHANGED events.
 
typeViewScrolled
 
Receives TYPE_VIEW_SCROLLED     events.
 
typeViewTextSelectionChanged
 
Receives     TYPE_VIEW_TEXT_SELECTION_CHANGED events.
 
typeAnnouncement
 
Receives TYPE_ANNOUNCEMENT     events.
 
typeViewAccessibilityFocused
 
Receives     TYPE_VIEW_ACCESSIBILITY_FOCUSED events.
 
typeViewAccessibilityFocusCleared
 
Receives     TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED events.
 
typeViewTextTraversedAtMovementGranularity
 
Receives     TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITYevents.
 
typeGestureDetectionStart
 
Receives     TYPE_GESTURE_DETECTION_START events.
 
typeGestureDetectionEnd
 
Receives     TYPE_GESTURE_DETECTION_END events.
 
typeTouchInteractionStart
 
Receives     TYPE_TOUCH_INTERACTION_START events.
 
typeTouchInteractionEnd
 
Receives     TYPE_TOUCH_INTERACTION_END events.
 
typeWindowsChanged
 
Receives TYPE_WINDOWS_CHANGED     events.
 
typeContextClicked
 
Receives     TYPE_VIEW_CONTEXT_CLICKED events.
 
typeAssistReadingContext
 
Receives     TYPE_ASSIST_READING_CONTEXT events.
 
typeAllMask
 
Receives TYPES_ALL_MASK i.e. all     events.
 
accessibilityFeedbackType
 
配置回馈给用户的体例,有语音播出和振动(多个值由“|”分开)(可在运转时点窜)。
 
值有:
 
 
申明
 
feedbackSpoken
 
Provides FEEDBACK_SPOKEN     feedback.
 
feedbackHaptic
 
Provides FEEDBACK_HAPTIC     feedback.
 
feedbackAudible
 
Provides FEEDBACK_AUDIBLE     feedback.
 
feedbackVisual
 
Provides FEEDBACK_VISUAL     feedback.
 
feedbackGeneric
 
Provides FEEDBACK_GENERIC     feedback.
 
feedbackAllMask
 
Provides FEEDBACK_ALL_MASK     feedback.
 
notificationTimeout
 
相像范例的两个事件之间的非常小时间发送到该服无(可在运转时点窜)。
 
accessibilityFlags
 
可走访性(多个值由“|”分开)(可在运转时点窜)。
 
值有:
 
 
申明
 
flagDefault
 
Has flag DEFAULT
 
flagIncludeNotImportantViews
 
Has flag     FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
 
flagRequestTouchExplorationMode
 
Has flag     FLAG_REQUEST_TOUCH_EXPLORATION_MODE
 
flagRequestEnhancedWebAccessibility
 
Has flag     FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY
 
flagReportViewIds
 
Has flag FLAG_REPORT_VIEW_IDS
 
flagRequestFilterKeyEvents
 
Has flag     FLAG_REQUEST_FILTER_KEY_EVENTS
 
flagRetrieveInteractiveWindows
 
Has flag     FLAG_RETRIEVE_INTERACTIVE_WINDOWS
 
packageNames
 
响应的程序的包名(多个值由“,”分开)(可在运转时点窜)。
 
canRetrieveWindowContent
 
是否能够检索活动窗口的内容(不行在运转时点窜)。
 
settingsActivity
 
允许用户点窜此服无的配置的活动组件称号,(要是不必要在运转时点窜配置,可纰漏该项)(不行在运转时点窜)。
 
点窜配置,可应用:android.accessibilityservice.AccessibilityService.setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo).
 
3、AndroidManifest里注册服无
 
AndroidManifest.XML文件增加以下配置
 
// 体系权限
 
 
 
 
 
 
 
// XXXXX为上头新建的配置XML文件
 
 
 
获取UI元素
 
在onAccessibilityEvent中,应用参数event的getSource要领获取到的AccessibilityNodeInfo实例,即为触发此次事件的UI节点。获取到目前界面UITree的根节点可以应用findAccessibilityNodeInfosByText或者findAccessibilityNodeInfosByViewId要领。必要留意findAccessibilityNodeInfosByText在获取UI元素时的校验逻辑是包含而非即是。
 
示例代码如:
 
Listnodes = event.getSource().findAccessibilityNodeInfosByText("登时安置");
 
Listnodes = event.getSource().findAccessibilityNodeInfosByViewId("txt_1");
 
模拟用户操纵
 
模拟点击
 
获取界面上UI元素以后,可凭据元素是否可响应操纵进行响应的处分。比方,要是UI元素是一个有用的按钮,则可以应用下面的代码来进行模拟点击:
 
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
 
同理,要是UI元素是一个有用的列表,则可以应用下面的代码进行模拟滑动:
 
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
 
模拟物理键
 
也能够模拟物理键的操纵,比方模拟按下返回键的代码是:
 
AccessibilityService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
 
模拟翻开消息关照栏
 
在上头先容accessibilityEventTypes中提到有一个事件: typeNotificationStateChanged,它就是消息关照栏状况产生改变变触发。少许红包外挂工具里头,一有红包就提醒的道理就是在onAccessibilityEvent中监听该事件,而后校验环节字并翻开关照,示例环节代码如:
 
if(event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED){
 
return;
 
}
 
Listtexts = event.getText();
 
if(texts.size() <= 0 || !mAutoTrack) {
 
return;
 
}
 
for(CharSequence text : texts) {
 
String content = text.toString();
 
if(!content.contains("[微信红包]")){
 
continue;
 
}
 
if(event.getParcelableData() == null || !(event.getParcelableData() instanceofNotification)) {
 
continue;
 
}
 
Notification notification = (Notification)event.getParcelableData();
 
PendingIntent pendingIntent =notification.contentIntent;
 
try{
 
pendingIntent.send();
 
}catch (PendingIntent.CanceledException e) {
 
e.printStackTrace();
 
}
 
}
 
语音播放
 
起首,定义一个TextToSpeech工具,并在服无连上落伍行初始化,示例代码如:
 
private TextToSpeech mTts;
 
……
 
mTts = newTextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
 
@Override
 
public void onInit(int status) {
 
if (status == TextToSpeech.SUCCESS) {
 
mTts.setLanguage(Locale.US);
 
}
 
}
 
});
 
执行语音播放代码:
 
mTts.speak("hello",TextToSpeech.QUEUE_FLUSH, null);
 
非常后别忘记释放资源:
 
mTts.shutdown();
 
建议:
 
在开发APP想支持语音播功效时,建议在用户界面控件中,通过应用android:contentDescription属性来描控件特性。
 
对于EditText控件,提供了一个android:hint属性取代了contentDescription属性
 
校验是否开启辅助功效
 
intaccessibilityEnabled =Settings.Secure.getInt(context.getApplicationContext().getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
 
if(accessibilityEnabled == 1) {
 
String settingValue =Settings.Secure.getString(context.getApplicationContext().getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
 
}
 
要是手机中开启了少许APP的辅助功效,settingValue的值为:APP1包名/APP1秉承AccessibilityService类全名: APP2包名/APP2秉承AccessibilityService类全名
 
应用Dump View Hierarchy for UI Automator剖判UI界面视图赞助查找节点工具
 
一、
 
 
 

上篇:上一篇:android 后台常驻,不会被kill
下篇:下一篇:Andriod中WebView加载登录界面获得Cookie