Accessibility辅助控制类

 

熟悉Android开发的都知道辅助功能服务 Accessibility service。他的作用有很多,360豌豆荚等应用市场的非root自动安装,微信抢红包插件,盲人辅助程序等等功能都是靠它实现的。 网上关于AccessibilityService的阐述和用法已经很多很详细了,能翻墙且英文没问题就直接看官网:http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html这里介绍个模拟自动点击事件的流程。

附上demo: https://github.com/jackuhan/WeChatLuckyMoney

我们写一个继承自AccessibilityService的XXXService类,在manifest中注册下

<service
                android:name=".XXXService"
                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/accessible_service_config"/>
        </service>


这里注册了响应AccessibilityService 的intent-filter,那么这个service可以在系统触发AccessibilityEvent的时候被回调到。这个时候你的service此时会响应所有应用的同类Event,如果想只响应某个特殊应用就需要使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo),这个需要在

onServiceConnected() 的回调中设置。

@Override
public void onServiceConnected() {
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
    info.packageNames = new String[]  {"com.example.android.myFirstApp", "com.example.android.mySecondApp"};
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    info.notificationTimeout = 100;
    this.setServiceInfo(info);
}



在程序中判断有没有开启这个自动点击服务。

AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
        List<AccessibilityServiceInfo> accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
        for (AccessibilityServiceInfo info : accessibilityServices) {
            if (info.getId().equals(getPackageName() + "/.XXXService")) {
                //开启了服务
            }
        }


如果没有开启,那么打开系统设置页面,用户点击开启。

Intent mAccessibleIntent =  new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(mAccessibleIntent);




AccessibilityService有以下几个回调

public void onAccessibilityEvent(AccessibilityEvent event);
        public void onInterrupt();
        public void onServiceConnected();
        public void init(int connectionId, IBinder windowToken);
        public boolean onGesture(int gestureId);
        public boolean onKeyEvent(KeyEvent event);


onServiceConnected ()方法是AccessibilityService声明周期的一部分,在系统成功与服务绑定后才被呼叫,如果用来设定AccessibilityServiceInfo.这个方法更为方便。


这里需要在onAccessibilityEvent的回调中得到AccessibilityEvent ,

通过AccessibilityEvent.getSource()方法能够从资源中获得窗口的内容和行为,AccessibilityNodeInfo。通过findAccessibilityNodeInfosByViewId()或者findAccessibilityNodeInfosByText()方法可以确定我们要点击的按钮;

,然后performAction  ACTION_CLICK即可就完成了点击名称为"Name"的控件的事件了。


onAccessibilityEvent(AccessibilityEvent event)  {
AccessibilityNodeInfo nodeInfo = event.getSource()
List<AccessibilityNodeInfo> fetchNodes = nodeInfo.findAccessibilityNodeInfosByText("Name");
AccessibilityNodeInfo openNode = fetchNodes.get(int i);
openNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}



Android 4.0版本中增加了一个新特性,就是能够用AccessibilityService来遍历View层级,并从产生Accessibility 事件的组件与它的父子组件中提取必要的信息。为了实现这个目的,你需要配置:android:canRetrieveWindowContent="true"。同时Android 4.0版本开始,可以使用XML文件来配置这类service。

格式如下所示:

<accessibility-service
     android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
     android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
     android:accessibilityFeedbackType="feedbackSpoken"
     android:notificationTimeout="100"
     android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
     android:canRetrieveWindowContent="true"
/>

如果你使用了xml配置service的方式,确保在manifest中声明 <meta-data>这个标签内容,指定该service保存在res/xml/serviceconfig.xml中,例如这样:

<service android:name=".MyAccessibilityService">
     <intent-filter>
         <action android:name="android.accessibilityservice.AccessibilityService" />
     </intent-filter>
     <meta-data android:name="android.accessibilityservice"
     android:resource="@xml/serviceconfig" />
</service>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值