原创内容,转载请注明原文网址: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