Android AccessibilityService使用注意

2024-02-03 23:30

本文主要是介绍Android AccessibilityService使用注意,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转至元数据起始

AccessibilityService简介

简介

AccessibilityService是一个辅助类,可以监听我们手机的焦点,窗口变化,按钮点击等等。实现它的服务需要在手机设置里面->辅助功能在这里面找到你自己实现的辅助类,然后打开它就可以进行我们一系列的监听了。还可以对监听的对象进行一些脚本的操作。

 

配置

Manifest.xml配置

新建一个类继承AccessibilityService,并在AndroidManifest文件里注册它,加入对应的Intent-filter,表明是一个辅助服务,同时加入相应的权限.

<application><service android:name=".MyAccessibilityService" android:label="@string/accessibility_service_label"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter></service><uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
</application>

 

配置辅助服务

在代码中配置

一般在onServiceConnected()方法里进行

    private void setServiceInfo(int feedbackType) {AccessibilityServiceInfo info = new AccessibilityServiceInfo();// We are interested in all types of accessibility events.info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;// We want to provide specific type of feedback.info.feedbackType = feedbackType;// We want to receive events in a certain interval.info.notificationTimeout = EVENT_NOTIFICATION_TIMEOUT_MILLIS;// We want to receive accessibility events only from certain packages.info.packageNames = PACKAGE_NAMES;setServiceInfo(info);}

在xml文件中配置

从Android4.0开始,开发者可以通过在AndroidManifest里添加标签

<service android:name=".MyAccessibilityService">...<meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_service_config" />
</service>

配置实现类

子类MyAccessibilityService继承AccessibilityService,并实现相应的重载方法:

onServiceConnected() 可选。系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置工作
onAccessibilityEvent() 通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。
onInterrupt() 必须。这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。
onUnbind() 可选。在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作
方法
描述

实操

onAccessibilityEvent()中对事件进行监听筛选

    public void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType();switch (eventType) {case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:  //收到通知栏消息break;case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:    //界面状态改变break;case  AccessibilityEvent.TYPE_VIEW_CLICKED:   //点击事件break;case AccessibilityEvent.CONTENT_CHANGE_TYPE_TEXT: //文本改变break;//省略其他的一堆可以监听的事件}}

获取当前界面各种资源,信息

        //获取根节点AccessibilityNodeInfo rootNode = getRootInActiveWindow();//匹配Text获取节点List<AccessibilityNodeInfo> list1 = rootNode.findAccessibilityNodeInfosByText("match_text");//匹配id获取节点List<AccessibilityNodeInfo> list2 = rootNode.findAccessibilityNodeInfosByViewId("match_id");//获取子节点AccessibilityNodeInfo infoNode = rootNode.getChild(index);

执行脚本操作

                //模拟点击事件target.performAction(AccessibilityNodeInfo.ACTION_CLICK);//模拟输入内容clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);ClipData clip = ClipData.newPlainText("label", "");clipboard.setPrimaryClip(clip);target.performAction(AccessibilityNodeInfo.ACTION_PASTE);

模拟Home,Back键

        //后退键performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);//Home键performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);//模拟左滑performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT);

抢红包思路

1.监听微信应用发出的Notification,检查字段是否有“微信红包”字段;
2.点击Notification,进入微信界面
3.调用getRootInActiveWindow()获取根节点;
4.调用findAccessibilityNodeInfosByText(“领取红包”),获取该节点
5.调用performAction(AccessibilityNodeInfo.ACTION_CLICK)实现模拟点击
坑点
1.包被混淆,之前通过Android Device Monitor查看ID,然后根据findAccessibilityNodeInfosByID()去匹配节点,包被混淆之后每个版本不一样
2.很难找出没有文本的控件,如EditText,ImageView
    private void findEditText(AccessibilityNodeInfo root) {if (root.getClassName().equals("android.widget.EditText")) {target = root;} else {for (int i = 0; i < root.getChildCount(); i++) {if (root.getChildCount() != 0) {findEditText(root.getChild(i));}}}}
3.锁屏抢红包要解除锁屏,isKeyguardLocked()方法错误理解。刚开始写代码的时候默认检测是否有锁屏,如果锁屏了调用disableKeyguard(),解锁,然后再检测是否真正解锁,成功解锁之后再进行抢红包的逻辑。后面发现disableKeyguard()并不是真正能够解锁,只是隐藏了锁屏。
                           km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);//得到锁管理器对象boolean flag = km.isKeyguardLocked();isFromNotification = true;if (flag == true) {kl = km.newKeyguardLock("unLock");kl.disableKeyguard();}gotoWeCharUI(event);

 

官方对disableKeyguard()解释: 
* Disable the keyguard from showing. If the keyguard is currently 
* showing, hide it. The keyguard will be prevented from showing again 
* until {@link #reenableKeyguard()} is called.


这篇关于Android AccessibilityService使用注意的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675744

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为