前言:
最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息)。
当时我第一反应是不可能,如果能够在别的app中获取对应的信息,那岂不是太不安全了。直到我知道了AccessibilityService这个东西。
基本思路:
利用AccessibilityService服务来获取到微信页面的页面信息,并获取到用户的微信号,有了微信号一切都好办了。
由于获取用户好友微信号和获取本人微信号的方法相同,因此此篇文章主要介绍的是如何通过AccessibilityService来获取本人的微信号。
过程:
AccessibilityService是什么?
在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。
它的具体实现是通过AccessibilityService服务运行在后台中,通过AccessibilityEvent接收指定事件的回调。这样的事件表示用户在界面中的一些状态转换,例如:焦点改变了,一个按钮被点击,等等。这样的服务可以选择请求活动窗口的内容的能力。简单的说AccessibilityService就是一个后台监控
服务,当你监控的内容发生改变时,就会调用后台服务的回调方法。
如何创建一个AccessibilityService?
实现一个自己的AccessibilityService,需要继承AccessibilityService类,并至少实现onAccessibilityEvent和onInterrupt方法:
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中的一些常用方法:
- disableSelf():禁用当前服务,服务可以通过该方法停止运行;
- findFocus(int focus):查找拥有特定焦点类型的控件;
- getRootInActiveWindow():如果配置能够获取窗口内容,则会返回当前活动窗口的根结点;
- getServiceInfo():获取当前服务的配置信息;
- onAccessibilityEvent(AccessibilityEvent event):有关AccessibilityEvent事件的回调函数,系统通过sendAccessibiliyEvent()不断的发送AccessibilityEvent到此处;
- performGlobalAction(int action):执行全局操作,比如返回,回到主页,打开最近等操作;
- setServiceInfo(AccessibilityServiceInfo info):设置当前服务的配置信息;
- onServiceConnected():系统成功绑定该服务时被触发,也就是当你在设置中开启相应的服务,系统成功的绑定了该服务时会触发,通常我们可以在这里做一些初始化操作;
- 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:export