下集预告:
android 借助AccessibilityService实现模拟点击功能-几个工具类(二)

发此文还是想分享一些自己在android模拟点击这块的收获和想法

为什么开发模拟点击?

这是一个很好的问题。从我们开始开发微信相关的xposed模块的时候,就知道xposed这东西用着不踏实,时不时地微信给你来几个封号,搞的你的客户怨声载道。作为开发,面对销售显示出的大多是无奈、尴尬。

转而考虑市面上的类似于微商小蜜、微商工具箱一些微信辅助营销工具,准备开始模拟点击这方面的开发。

开始

首先新建一个service extends AccessibilityService,然后在manifest中注册,并且需要申明你采用的配置方案

accessibility.xml:

 <?xml version="1.0" encoding="utf-8"?>

配置中的属性大家可以自行了解,特别需要说明的是 accessibilityEventTypes 这个属性,最好不好接收全部的行为类型,一个是日志不好看,一个是没有必要。常用的类型就上面几个就够了。其中typeWindowStateChanged中重点,他是activity切换的时候,或者一个dialog alert的时候触发的行为,常用来判断页面的切换,当前操作完成的依据。

其次是accessibilityFlags,这个属性需要设置flagRetrieveInteractiveWindows,为什么呢,当你用 mService.getRootInActiveWindow()这个方法获取当前视图的最顶级window的方法,当两个activity切换的时候,中间有个渲染的时间差,要resume的activity附着的window还没渲染出来,你就调用了,就会返回null,但是加上这个属性,会返回手机底层的window,就是titleBar附着的那一层window,这样就避免了有时候会发生的空指针异常。

/** * Gets the root node in the currently active window if this service * can retrieve window content. The active window is the one that the user * is currently touching or the window with input focus, if the user is not * touching any window. public AccessibilityNodeInfo getRootInActiveWindow() {    return AccessibilityInteractionClient.getInstance().getRootInActiveWindow(mConnectionId);}

引导用户去打开无障碍-辅助服务

判断你的服务在不在运行?

这里有几个坑需注意,你要是简单的用获取你的应用的服务栈来判断服务在不在运行的方法是不可取的,因为即使是service在内存中运行,但是因为一些报错或者其他的原因,你的AccessibilityService服务可能会在AccessibilityManager里面消失掉。

这里我用的方法是在onServiceConnected 方法中先保存service实例,然后通过以下方法判断你的service可不可用

/** * 判断辅助服务是否正在运行 */public static boolean isServiceRunning(AccessibilityService service) {    if (service == null) {        return false;    }    AccessibilityManager accessibilityManager = (AccessibilityManager) service.getSystemService(Context.ACCESSIBILITY_SERVICE);    AccessibilityServiceInfo info = service.getServiceInfo();    if (info == null) {        return false;    }    List list = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);    Iterator iterator = list.iterator();    boolean isConnect = false;    while (iterator.hasNext()) {        AccessibilityServiceInfo i = iterator.next();        if (i.getId().equals(info.getId())) {            isConnect = true;            break;        }    }    if (!isConnect) {        return false;    }    return true;}

跳转到开启服务页面

    /** * 打开辅助服务的设置 */public static void openAccessibilityServiceSettings(Activity context) {    try {        Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);        context.startActivity(intent);    } catch (Exception e) {        e.printStackTrace();    }}

接收事件

做了以上这些时候能 你就可以愉快的在你的service里面接收微信相关的控件出发的事件了

public class MainService extends AccessibilityService {@Overrideprotected void onServiceConnected() {    super.onServiceConnected();    AccessibilityHelper.mService = this;    L.e("onServiceConnected");}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {    L.e("当前事件:" + event.toString());}}

下一篇将介绍对于接收事件的处理

更多相关文章

  1. Google 菜市场(Android Market)上不去的解决方法
  2. [置顶] Android开发:在onTouchEvent中处理任意时间的长按事件
  3. Android高手进阶教程(二十一)之---Android中创建与几种解析xml的
  4. Android事件总线(四)源码解析otto
  5. Android 应用程序查找设备的方法——以串口为例

随机推荐

  1. 20、android解决方案
  2. Android(安卓)天气预报 完整案例详解
  3. Gradle Android最新自动化编译脚本教程
  4. Google Maps API申请 之 Android(安卓)Ma
  5. 生成so
  6. Android的Animation之LayoutAnimation使
  7. ArcGIS Runtime SDK for Android(安卓)v1
  8. Android(安卓)Service完全解析(下)
  9. Android(安卓)Studio试用说明
  10. android游戏引擎andengine学习系列六:Phy