利用AccessibilityService自动获取微信号(Android)

前言:

最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息)。

当时我第一反应是不可能,如果能够在别的app中获取对应的信息,那岂不是太不安全了。直到我知道了AccessibilityService这个东西。

基本思路:

利用AccessibilityService服务来获取到微信页面的页面信息,并获取到用户的微信号,有了微信号一切都好办了。

由于获取用户好友微信号和获取本人微信号的方法相同,因此此篇文章主要介绍的是如何通过AccessibilityService来获取本人的微信号。

过程:

AccessibilityService是什么?

在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。

它的具体实现是通过AccessibilityService服务运行在后台中,通过AccessibilityEvent接收指定事件的回调。这样的事件表示用户在界面中的一些状态转换,例如:焦点改变了,一个按钮被点击,等等。这样的服务可以选择请求活动窗口的内容的能力。简单的说AccessibilityService就是一个后台监控

服务,当你监控的内容发生改变时,就会调用后台服务的回调方法。

如何创建一个AccessibilityService

实现一个自己的AccessibilityService,需要继承AccessibilityService类,并至少实现onAccessibilityEventonInterrupt方法:

 1 public class MyAccessibilityService extends AccessibilityService {
 2
 3     final String TAG = "MyAccessibilityService";
 4
 5     /**
 6      * 当服务启动的时候会被调用
 7      */
 8     @Override
 9     protected void onServiceConnected() {
10         super.onServiceConnected();
11         Log.d(TAG, "connected");
12     }
13
14     /**
15      * 监听窗口变化的回调
16      */
17     @Override
18     public void onAccessibilityEvent(AccessibilityEvent event) {
19         Log.d(TAG, event.getPackageName() + "");
20     }
21
22     /**
23      * 中断服务的回调
24      */
25     @Override
26     public void onInterrupt() {
27         Log.d(TAG, "onInterrupt");
28     }
29 }

AccessibilityService中的一些常用方法:

  1. disableSelf():禁用当前服务,服务可以通过该方法停止运行;
  2. findFocus(int focus):查找拥有特定焦点类型的控件;
  3. getRootInActiveWindow():如果配置能够获取窗口内容,则会返回当前活动窗口的根结点;
  4. getServiceInfo():获取当前服务的配置信息;
  5. onAccessibilityEvent(AccessibilityEvent event):有关AccessibilityEvent事件的回调函数,系统通过sendAccessibiliyEvent()不断的发送AccessibilityEvent到此处;
  6. performGlobalAction(int action):执行全局操作,比如返回,回到主页,打开最近等操作;
  7. setServiceInfo(AccessibilityServiceInfo info):设置当前服务的配置信息;
  8. onServiceConnected():系统成功绑定该服务时被触发,也就是当你在设置中开启相应的服务,系统成功的绑定了该服务时会触发,通常我们可以在这里做一些初始化操作;
  9. onInterrupt():服务中断时的回调。

声明该服务:

 1 <service
 2     android:name=".MyAccessibilityService"
 3     android:enabled="true"
 4     android:exported="true"
 5     android:label="这是一个用户测试的无障碍服务"
 6     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
 7     <intent-filter>
 8         <action android:name="android.accessibilityservice.AccessibilityService" />
 9     </intent-filter>
10 </service>

配置服务参数:

主要是用于声明该服务的一些配置参数,现在有两种配置服务参数的方法:在安卓4.0之后可以通过meta-data标签来在xml中配置,也可以通过动态代码直接配置。这里我们通过xml进行配置。

首先在res下的xml文件夹下创建配置文件,

1 <?xml version="1.0" encoding="utf-8"?>
2 <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
3     android:accessibilityEventTypes="typeAllMask"
4     android:accessibilityFeedbackType="feedbackAllMask"
5     android:canRetrieveWindowContent="true"
6     android:notificationTimeout="100"
7     android:packageNames="com.tencent.mm"
8     android:description="@string/description" />

然后将配置文件添加到清单文件中,

 1 <service
 2     android:name=".MyAccessibilityService"
 3     android:enabled="true"
 4     android:exported="true"
 5     android:label="这是一个用户测试的无障碍服务"
 6     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
 7     <intent-filter>
 8         <action android:name="android.accessibilityservice.AccessibilityService" />
 9     </intent-filter>
10     <meta-data
11         android:name="android.accessibilityservice"
12         android:resource="@xml/config_accessibility" />
13 </service>

下面对xml中的一些参数进行介绍:

  1. accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,焦点变化,长按等。具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知;
  2. accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动(此参数是必须的,不写的话不会走回调方法)
  3. canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容.也就是如果你希望在服务中获取窗体内容的化,则需要设置其值为true;
  4. notificationTimeout:接受事件的时间间隔,通常将其设置为100即可;
  5. packageNames:表示对该服务是用来监听哪个包的产生的事件,这里以微信的包名为例(如果要监听的包有多个,则可以在代码中设置;如若不写,则监控的是所有的包);
  6. description:对该服务的无障碍描述。

如何开启AccessibilityService呢?

以小米手机为例,在设置中打开更多设置,进入无障碍。然后打开之前声明的服务即可。

如何获取微信“我的”页面的微信号呢?

这里主要利用AccessibilityNodeInfofindAccessibilityNodeInfosByViewId(String viewId)方法,该方法用于根据控件标识来获取到整个控件。

那么问题来了,如何知道微信该控件的标识呢?这里可以通过SDK的工具DDMS工具。

进入SDK目录的tools目录,找到monitor.bat文件,双击即可。

进入DDMS界面后,选中微信的包名,并点击如下所示按钮即可分析当前微信页面的布局信息:

如下图,可以发现该控件的标识为:com.tencent.mm:id/czz

因此,即可通过如下方法获取到该控件的值:

 1 @Override
 2 public void onAccessibilityEvent(AccessibilityEvent event) {
 3     Log.d(TAG, event.getPackageName() + "");
 4
 5     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
 6         // 通过id获取到微信号的View
 7         List<AccessibilityNodeInfo> nodeInfoList = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.tencent.mm:id/czz");
 8         String wxCode;
 9         if (nodeInfoList != null && nodeInfoList.size() > 0) {
10             wxCode = nodeInfoList.get(0).getText().toString();
11             Log.d(TAG, wxCode);
12         }
13     }
14
15 }

运行结果如下:

总结:

  • 在过程中遇到了两个问题:第一个问题是运行完了之后服务已经开启,但是一直不走回调,经查是由于没有写accessibilityFeedbackType参数的原因;
  • 第二个问题是,一开始通过Android Studio自带的Layout Inspector来获取控件的标识,当时获取的标识是czz,并不全,导致一直获取不到相应的微信号;
  • 无障碍服务是一个很便携但是也很危险的服务,所以轻易不要给别人无障碍服务的权限;
  • 不要轻易对一件事进行判断,需要进行了解之后才进行判断(在此之前我一直觉得该功能是无法实现的);
  • 对于一个功能,第一反应应该是如何实现而不是如何推脱。

参考博客:

大家如果有什么疑问或者建议可以通过评论或者邮件的方式联系我,欢迎大家的评论~

原文地址:https://www.cnblogs.com/lanxingren/p/9983904.html

时间: 2024-08-27 23:09:34

利用AccessibilityService自动获取微信号(Android)的相关文章

微信公众平台开发—利用OAuth2.0获取微信用户基本信息

1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面wxProcess2.aspx,不带参数 [csharp] view plain copy Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&

新增客户端自动获取微信地址功能、优化商品规格编辑体验更新!

最近,微信小程序官方又更新了,又开放十几项接口,接口的增加意味着拥有小程序的企业主有了更多福利.酷客多作为国内首家微信小程序技术服务商自然要紧跟微信小程序官方的更新步伐,为客户提供最新最前沿的技术服务,为此我们做了此次更新.此次版本更新主要是小程序端地址添加优化和后端商品规格添加体验优化. 1.新增调用微信地址功能,小程序用户不用自己填写地址,直接调用微信填写好的地址,如果自动获取的地址不够精确可以手动修改. 通过此项功能改进减少了顾客自己添加收货地址的步骤,使购买体验更加简洁. 2.优化后端商

asp.net 利用HttpWebRequest自动获取网页编码并获取网页源代码

/// <summary> /// 获取源代码 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetHtml(string url, Encoding encoding) { HttpWebRequest request = null; HttpWebResponse respon

公众号和个人微信号加粉有效方法!

在粉丝经济的互联网时代,获得一个粉丝很难,但是失去一个粉丝,却很容易.尤其是对于微营销的小伙伴来说,只有获取有效的精准的粉丝,才是微信营销制胜之道.获取粉丝相对容易,但是获取精准粉丝却不易.如何吸引大量微信粉丝,达到微信个人号 公众号听众井喷式激增,并能提供托管管理和定制管理服务,是广大企业进行微信营销推广的一大助手,让客户省时.省力.又省心. 1.良好的信息渠道与内容更新--海量素材库 各大行业资讯尽收眼底,让"来推荐(http://t.cn/RwnucnJ)"用户坐拥海量互联网资源

微信网页授权认证获取用户的详细信息,实现自动登陆-微信公众号开发干货

原创声明:本文为本人原创作品,绝非他处转账,转载请联系博主 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出.下载地址:web开发工具下载 开发文档:https://mp.weixin.qq.com/wiki

如何通过微信公众号/微信号获取对应的二维码

方法一:利用游迹天下二维码工具获取   游迹天下彩色二维码工具 http://qr.uooji.com 已经提供了通过微信公众号或微信私人号的微信号获取对应二维码的功能.   使用方法很简单:打开 http://qr.uooji.com,在左侧导航提供了诸多二维码生成选项,第一项就是直接通过微信公众号或微信私号的微信号获取对应的二维码.   例如要获取游迹天下官方微信uooji_com的二维码图片,在输入框处输入uooji_com,然后点击右下角的“生成二维码”按钮即可以获得对应微信号的二维码.

微信公众号开发系列-获取微信OpenID

在微信开发时候在做消息接口交互的时候须要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID.接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获取OpenId(接收事件推送方式).下面事件中都能够获取到OpenID 关注/取消关注事件 用户在关注与取消关注公众号时.微信会把这个事件推送到开发人员填写的URL.方便开发人员给用户下发欢迎消息或者做帐号的解绑. 微信server在五秒内收不到响应会断掉连接,而且又一次发起请求,总共重试三次 关于

wxid数据提取软件,微信号原始id获取方式解密

wxid数据提取软件,微信号原始id获取方式解密,很多企业及商户做微信营销都面临着一个非常关键问题,那就是如何精准加粉,也许你玩过群 发软件,玩过了加群好友软件,但是这些都没法满足精准化微信加人需求,一款可以在电脑上加手机号码通讯录好友的软件肯怕你都没听说过吧.人人有站顺势推出全新黑科技产品,微信爆粉软件,全网开售.一台电脑,无限多开加粉,无需微信登陆账号密码,无需扫码即可在软件上直接导粉.手机号码转换wxid软件,IOS协议微信爆粉精准营销系统.如果你是菜鸟,以下功能你可能看不懂.全看完你就懂

从微信官方获取微信公众号名片:http://open.weixin.qq.com/qr/code/?username=haihongruanjian

从微信官方获取微信公众号名片:http://open.weixin.qq.com/qr/code/?username=haihongruanjian 个人的号,不知道怎么获取.