对AccessibilityService的学习已经有一个多月了,发现其使用方法其实也都蛮简单的,只是在不同项目中试错比较复杂。

使用AccessibilityService实现了微信自动切换账号的功能,图示如下(这个步骤都是全自动的喔):

使用方式是运行程序-开启无障碍服务,再切换到微信主界面,点击【我】的tab按钮,就会自动执行退出账号再登陆的逻辑了。

AccessibilityService使用基础:

Android辅助服务类主要是方便一些试听有障碍的用户实现无障碍服务的工具,直白的说就是通过它可以帮助这些用户更加简单地操作设备,包括文字转语音,触觉反馈,手势操作,轨迹球和手柄操作。

也可以利用该功能实现比如微信自动抢红包等等各种奇怪的功能(( ⊙ o ⊙ ))。

本文基于一样的原理,实现的是自动切换账号功能。(其实还有实现更酷炫的功能我就不放出来了2333)

实现原理:

1.配置辅助服务类。

2.通过遍历结点区分页面。

3.抓取特定结点通过模拟手势执行操作和页面间跳转以及输入等。

代码实现:

首先呢我们需要注册一个AccessibilityService。

配置文件accessible_service_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagReportViewIds"android:canRetrieveWindowContent="true"android:packageNames="com.tencent.mm"android:notificationTimeout="100" />

其中各项参数含义可以查阅API,这里要注意packageNames我写的是微信的包名,不指定的话是监听所有程序,指定特定包名就会只监听特定程序了。

然后在MaineFast中配置该辅助服务类:

 <serviceandroid:name=".MyAccessibilityService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessible_service_config" /></service>

写法都是范式,注意权限不能丢。

然后我们需要实现一个辅助服务类:

/*** Created by jiangzn on 17/2/6.*/
public class MyAccessibilityService extends AccessibilityService {@Overrideprotected void onServiceConnected() {LogUtils.d("onServiceConnected");}String description;@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {}@Overridepublic void onInterrupt() {LogUtils.d("onInterrupt");}}

在onAccessibilityEvent方法中实现我们的账号切换方法:

/*** 账号的切换* 默认在微信主界面* @param rootNodeInfo* @param event*/
private void test2(AccessibilityNodeInfo rootNodeInfo, AccessibilityEvent event) {//3.退出当前账号按钮List<AccessibilityNodeInfo> quiteNowCounts = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bch");LogUtils.d("退出当前账号按钮数量:" + quiteNowCounts.size());//4.大退按钮标识符List<AccessibilityNodeInfo> bigquitetagNow = rootNodeInfo.findAccessibilityNodeInfosByText("退出当前帐号后不会删除任何历史数据,下次登录依然可以使用本帐号。");LogUtils.d("大退按钮标识符数量:" + bigquitetagNow.size());//5.找到更多按钮List<AccessibilityNodeInfo> moreInfo = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bcb");LogUtils.d("更多数量:" + moreInfo.size());//6.切换账号按钮List<AccessibilityNodeInfo> changeBtnInfo = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/akv");LogUtils.d("切换账号按钮数量:" + changeBtnInfo.size());//7.使用其他方式登录按钮List<AccessibilityNodeInfo> changeWayInfo = rootNodeInfo.findAccessibilityNodeInfosByText("使用其他方式登录");LogUtils.d("使用其他方式登录按钮数量:" + changeWayInfo.size());//8.到微信登陆界面开始登陆List<AccessibilityNodeInfo> logintitleInfo =rootNodeInfo.findAccessibilityNodeInfosByText("登录微信");LogUtils.d("登陆界面标题框数量:" + logintitleInfo.size());if (logintitleInfo.size() != 0) {List<AccessibilityNodeInfo> loginInputInfo =rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/gr");for (AccessibilityNodeInfo tempNode : loginInputInfo) {if (tempNode.getText()!=null&&tempNode.getText().toString().contains("QQ号/微信号/Email")) {LogUtils.d("输入账号");NodeUtils.NodeInfoInput(tempNode, "微信号");loginInputInfo.remove(tempNode);LogUtils.d("输入密码");NodeUtils.NodeInfoInput(loginInputInfo.get(0), "微信密码");//再点击登录按钮List<AccessibilityNodeInfo> loginbtns =rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bbt");loginbtns.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);}}} else if (changeWayInfo.size() != 0) {LogUtils.d("点击使用其他方式登录按钮");changeWayInfo.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);} else if (changeBtnInfo.size() != 0) {LogUtils.d("点击切换账号按钮");List<AccessibilityNodeInfo> changgeCount = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/fa");changgeCount.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);} else if (moreInfo.size() != 0) {LogUtils.d("点击更多按钮");moreInfo.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);} else if (bigquitetagNow.size() != 0) {List<AccessibilityNodeInfo> bigquiteNow = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/abg");LogUtils.d("大退按钮数量:" + bigquiteNow.size());bigquiteNow.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);} else if (quiteNowCounts.size() != 0) {LogUtils.d("点击小退按钮");//点击退出当前账号quiteNowCounts.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);} else {//递归找到退出按钮// NodeUtils.findNodeByTxt(rootNodeInfo, "退出");if (description.contains("的聊天")) {//1.递归找到设置按钮List<AccessibilityNodeInfo> setBtns = rootNodeInfo.findAccessibilityNodeInfosByText("设置");LogUtils.d("设置按钮数量:" + setBtns.size());//点击设置按钮setBtns.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);} else if (description.contains("设置")) {//2.递归找到退出按钮List<AccessibilityNodeInfo> quiteBtns = rootNodeInfo.findAccessibilityNodeInfosByText("退出");LogUtils.d("设置界面的退出按钮数量:" + quiteBtns.size());//点击退出按钮quiteBtns.get(0).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);} else {}}
}

这里可以看到把整个过程分为了8个逻辑。

每一个逻辑步骤都是先通过遍历结点找到指定的按钮,再模拟按钮点击。

因为onAccessibilityEvent是循环触发的,所以会一直触发我们需要的界面逻辑,一直执行下去,最终实现自动切换账号的效果。

有不懂得可以问我哈,就不贴下载了。

AccessibilityService——实现微信切换账号功能相关推荐

  1. java切换账号功能_使用AccessibilityService实现微信自动切换账号功能

    对AccessibilityService的学习已经有一个多月了,发现其使用方法其实也都蛮简单的,只是在不同项目中试错比较复杂. 使用AccessibilityService实现了微信自动切换账号的功 ...

  2. 微信七年,终于实现一键切换账号功能了!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 58 万个小程序.1.7 亿日活用户.覆盖逾 100 万开发者和 2300 个第三方开发平台 ...

  3. signal软件如何退出账号_微信怎么一键切换登录 微信多账号一键切换方法【图文详解】...

    近日,在最新的安卓内测版中,腾讯悄然增加了一个切换账号功能,可以在两个账号之间一键切换.那么 微信如何一键切换登录 ?下面为大家带来 微信多账号一键切换方法 ,一起来看看. 微信一键切换登录 微信内测 ...

  4. hsrp 切换_微信可快速切换账号

    如上图,设置 - 账号与安全 - 切换账号,在这里就可以快速切换账号啦.最多只能在 2 个账号之间切换. 但是...不过... 该功能还没正式上线,据说只有「安卓测试版 6.5.16」才有这个功能.我 ...

  5. JAVA版本微信公众账号开源项目版本发布-jeewx1.0(捷微)

    JeeWx, 敏捷微信开发,简称"捷微". 捷微是一款免费开源的微信公众账号开发平台. 平台介绍: 一.简介 jeewx是一个开源,高效,敏捷的微信开发平台采用JAVA语言,它是基 ...

  6. 拼多多败诉,砍价始终差0.9%一案宣判;​微信内测同一手机号可注册两个账号功能;2022年度菲尔兹奖公布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  7. android如何实现微信功能吗,android 借助AccessibilityService实现模拟点击功能-微信助手(一)...

    下集预告: android 借助AccessibilityService实现模拟点击功能-几个工具类(二)发此文还是想分享一些自己在android模拟点击这块的收获和想法 为什么开发模拟点击? 这是一 ...

  8. 友盟微信登录-切换账号重新拉起授权

    需求:在第一次登录微信,切换账号时(注销微信),重新拉起授权界面. 第一步: 登录添加代码 final UMSocialService mController = UMServiceFactory.g ...

  9. 切换账号_在iOS 13在如何切换App Store账号

    在iOS 13中,App Store退出账号的位置有变动. 如果您有多个账号,需要在 App Store 中进行切换和下载应用,可以参考如下信息 注意事项: 1.建议在 App Store 中切换账号 ...

最新文章

  1. easyui英文提示变中文
  2. swagger怎么扫描多个包_Swagger快速入门
  3. python 静态方法与类方法
  4. qt android 网络编程实例,QT网络编程Tcp下C/S架构的即时通信实例
  5. Android 使用代码设置selector 的图片或文字颜色
  6. 车牌处理程序-学-使-警 fileparts 的用法
  7. visitor设计模式记录
  8. excel函数学习系列一
  9. 算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence
  10. 二叉树非递归遍历——python
  11. APP推广关键词的怎么选词?
  12. 分而治之(Work Breakdown Structure, WBS)
  13. 量子计算机的基本构成,量子计算机的硬件单元 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器。假设有一个由3比特构成的寄存器,在经典计算机中,可... - 雪球...
  14. 个人管理 - 第四代时间管理
  15. 命令解压aar、文件压缩成aar图文详解
  16. 迈向“5G智慧校园”的第一步,启用人脸识别门禁设备
  17. 找工作必看!!!关于什么叫做三方协议
  18. OpenGL模拟太阳系运行
  19. java吃货联盟app讲解_java吃货联盟订餐系统
  20. CSS简介代码实现表格(table)只有横线没有竖线的效果,一个简约卡片化精美的数据表格(类似Bootstrap表格)

热门文章

  1. 淘宝下架苹果iOS充值业务,马云或在为支付宝扫除障碍
  2. 计算机文件大小排序工具,如何对电脑文件夹进行排序
  3. 升级Android Q之路遇到的坑-abc_screen_simple
  4. 复旦大学机试题2019A斗牛
  5. ios降级鸿蒙,iOS14正式版怎么降级到iOS13.7 iOS14降级操作流程
  6. Matlab扫雷记录01-matlab中获得向量非零元素个数
  7. 反向延长线段什么意思_《反向延长线》
  8. Python函数命名-PEP8编码规范的说明及IDE提示的忽略
  9. 通用汽车将向底特律郊区一家工厂投资3亿美元
  10. 灵活用工系统开发|劳务派遣有风险吗?