zoukankan      html  css  js  c++  java
  • 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()方法可以确定我们要点击的button;

    ,然后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>
    




  • 相关阅读:
    Java实现稳定婚姻问题
    Java实现二分图的最大匹配
    Java实现二分图的最大匹配
    Java实现二分图的最大匹配
    Java实现二分图的最大匹配
    Java实现二分图的最大匹配
    OpenGL与Directx的区别
    为什么API多用C而不是C++,为什么C++程序大多不使用异常
    一次C#和C++的实际应用性能比较(C++允许我们使用任何手段来提高效率,只要愿意做出足够的努力)
    图形界面编程成就了C++
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7068397.html
Copyright © 2011-2022 走看看