初识AccessibilityService

AccessibilityService作为安卓中无障碍辅助服务,所谓无障碍就是不需要用户手动操作,自动完成一些列事件。给我印象最深刻的就是魅族手机出来的时候,自带微信抢红包功能,当时是真的让我羡慕了一把。这尼玛,每次红包最先抢,而且当时还总是认为先抢的红包大,那个羡慕嫉妒恨啊。

今天有一个同事,想做一个微信自动发广告的(微商一般都想这样),需求是这样的:在软件中提前设置好要发送的内容,通过微信,定时发送到朋友圈。听到这个需求,我第一个想起的就是微信自动抢红包,于是搜了一下,网上的资料还不是很多,不过供学习的使用还是可以。参考了http://www.jianshu.com/p/4cd8c109cdfb(涅槃1992)的简述文章,自己也总结一下使用的心得。

使用步骤

1、创建自己的服务类,继承AccessabilityService,会实现两个抽象方法:onAccessibilityEvent(AccessibilityEvent event)onInterruput()

我们要做的主要工作在onAccessibilityEvent(AccessibilityEvent event)这个方法中,后面在详细说明

2、在AndroidManifest.xml中声明该服务。

<service
    android:name=".AutoSendServiece"
    android:enabled="true"
    android:exported="true"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>

    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/auto_reply_service_config" />
</service>


permission 和 标签必须要有,而且不能少。
resource中的配置文件如下(auto_reply_service_config)

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged" 
android:accessibilityFeedbackType="feedbackGeneric" 
android:accessibilityFlags="flagDefault" 
android:canRetrieveWindowContent="true" 
android:description="@string/accessibility_service_description" 
android:notificationTimeout="100" android:packageNames="com.tencent.mm" />
字段说明:
packageNames是来过滤监听具体包的事件,如果没有,则是所有的程序包。我这里是微信的
accessibilityEventTypes表示监听那种事件类型,窗口变化,通知等等,如果是所有的则用typeAllMask
具体的参考api文档。
下面对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;
      }
  }

可以在api文档中查阅AccessibilityEvent相关说明,还有很多事件类型,一般用的较多的可能就是通知,以及界面变化(也就是以上两个事件类型,具体的做具体分析)
其次用的比较多的是AccessibilityNodeInfo这个信息,可以通过getRootInActiveWindow()获取,官方解释为:
Gets the root node in the currently active window if this service can retrieve window content.(大致意思是获取当前可见窗口界面根节点信息,当然前提是服务能检索到窗口内容)
通过AccessibilityNodeInfo我们可以做很多事了,大部分的操作也是通过这个类来的。

这两个方法也是使用过程中用的最多的,通过id或者文字查找到指定控件,然后就可以执行我们想要的点击、长按等一系列操作。比如

查找资源id或者名字可以通过android studio的设备查看器查看。

查看
标题

选中你的设备,点击图示的按钮,就可以抓取到屏幕元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章