【安卓开发】AccessibilityService学习,实现辅助点击功能
通过辅助点击的运用,加深对安卓无障碍服务的理解
第一步:配置xml文件和AccessibilityService
在res下新建xml文件夹并在其中新建accessibility_service_config.xml文件,下面是配置这个xml的代码示例
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault|flagReportViewIds|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
android:canRetrieveWindowContent="true"
android:canPerformGestures="true"
android:description="@string/accessibility_txt"
android:notificationTimeout="100"
android:packageNames="目标App包名"
/>
创建继承AccessibilityService的类,并在AndroidManifest.xml中注册和配置
<service
android:name="com.jbjtech.dyclickdemo.service.FloatDialogService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="mediaProjection"
android:label="描述"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
第二步:获取界面里的控件属性
执行模拟点击,你首先需要获取目标App界面里的控件id,获取这些元素的方法有很多,下面介绍两种。
1.真机获取,使用Android Studio 3.0以后弃用Android Device Monitor,如果你的AS版本大于3.0,那么你可以在sdk的安装目录下找到tools文件夹,并在其中找到monitor.bat并打开。在monitor中选择手机,点击红圈。(不一定能成功获取,多尝试)
2.使用模拟器+Layout Inspector(模拟器已root,可随意获取)
第三步:利用获取到的控件id,执行模拟点击
在继承AccessibilityService类中重写的onAccessibilityEvent(AccessibilityEvent event)方法里获取根AccessibilityNodeInfo
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
AccessibilityOperate.getOperate().updateEvent(this, event);
AccessibilityNodeInfo nodeInfo
= FloatDialogService.this.getRootInActiveWindow();
break;
}
}
利用我们找到的控件id以及根AccessibilityNodeInfo的findAccessibilityNodeInfosByViewId(viewId)方法找到控件的List<AccessibilityNodeInfo>。
让控件的List<AccessibilityNodeInfo>中子AccessibilityNodeInfo执行performAction(AccessibilityNodeInfo.ACTION_CLICK)方法实现模拟点击。
public boolean performClick(List<AccessibilityNodeInfo> nodeInfo) {
AccessibilityNodeInfo node;
for (int i = 0; i < nodeInfo.size(); i++) {
node = nodeInfo.get(i);
if (node.isEnabled() && node.isClickable()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
return node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
return false;
}
判断控件的List<AccessibilityNodeInfo>是否展示
public boolean isTargetViewShow(List<AccessibilityNodeInfo> infos) {
if (infos != null && infos.size() > 0) {
return true;
}
return false;
}
你能找到的控件id,以及具体点击顺序,可以根据自己喜好来设定。
demo下载地址:利用AccessibilityService实现抖Y直播间自动秒抢红包Demo-Android文档类资源-CSDN下载
App下载地址:
完毕
更多推荐
所有评论(0)