android Accessibility 实现自动升级,安装

来源:互联网 发布:东经北纬查询软件 编辑:程序博客网 时间:2024/05/14 22:37

当初google 开发此功能主要是对于那些由于视力、听力或其它身体原因导致不能方便使用Android智能手机的用户,Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音、触觉反馈、手势操作、轨迹球和手柄操作。开发者可以搭建自己的Accessibility服务,这可以加强可用性,例如声音提示,物理反馈,和其他可选的操作模式。

随着Android版本的不断升级,Android Accessibility功能也越来越强大,Android 4.0版本以前,系统辅助服务功能比较单一,仅仅能过单向获取窗口元素信息,比如获取输入框用户输入内容。到Android 4.1版本以后,系统辅助服务增加了与窗口元素的双向交互,此时可以通过辅助功能服务操作窗口元素,比如点击按钮等。

由于系统辅助服务能够实时获取您当前操作应用的窗口元素信息,这有可能给你带来隐私信息的泄露风险,比如获取非密码输入框的输入内容等。同时通过辅助功能也可以模拟用户自动化点击应用内元素,也会带来一定的安全风险.

Accessibility使用指导:

android.accessibilityservice包提供增强的或者可供选择的反馈给用户,他是一个service。
这个service运行在后台,接收events发出时系统的回调或者反馈。这些event传递用户接口的一些反馈,例如,用户焦点改变了,button被点击了,等等。
这个service提供了查询当前活动窗口内容的能力,这样可以获取当前手机上活动窗口的信息哦。
如果你想开发这样一个类,需要集成这个类,并且实现他的抽象方法。
AccessibilityServiceInfo类来描述android.accessibilityservice,系统通过封装过的AccessibilityServiceInfo,使用events来通知android.accessibilityservice触发一些事件。

1.先写自定义一个类extends AccessibilityService.同时实现onAccessibilityEvent 和onInterrupt 方法,onAccessibilityEvent是每个事件捕获都会调用的方法

@Override

public void onAccessibilityEvent(AccessibilityEvent event)

@Override

public void onInterrupt()

 2.自定义处理过程 processinstallApplication,

   A.查找相关处理的控件 .findAccessibilityNodeInfosByText 这里可以根据显示内容来进行查找,也可以根据id来查找 

   B.把我们想要处理的事件直接通给对应的View 通过performAction方法ps: performAction(AccessibilityNodeInfo.ACTION_CLICK);

  3.通过AndroidMainfest 声明相应的Service 注意需要 BIND_ACCESSIBILITY_SERVICE权限 

    A.声明Service 

    <service android:label="@string/acc_service_name" android:name="com.qding.accessibility.InstallUnInstallService" 

            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/install_accessibility" />

        </service>

    B.配置监听属性   

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"

    android:accessibilityEventTypes="typeAllMask" //事件类型

    android:accessibilityFeedbackType="feedbackGeneric"

    android:accessibilityFlags="flagDefault"

    android:packageNames="com.android.packageinstaller" //监听应用名

    android:canRetrieveWindowContent="true"

    android:description="@string/accessibility_service_description"

    android:notificationTimeout="500" />

话不多说直接上核心处理安装代码

private void processinstallApplication(AccessibilityEvent event) {Log.d(TAG, "processinstallApplication !!!!!!!!!!!! " + event.getPackageName());int childCount = event.getSource().getChildCount();for(int i=0 ;i< childCount;i++) {AccessibilityNodeInfo child = event.getSource().getChild(i);Log.d(TAG, "processinstallApplication test test  " + child.getText());}if (event.getSource() != null) {if (event.getPackageName().equals("com.android.packageinstaller")) {List<AccessibilityNodeInfo> unintall_nodes = event.getSource().findAccessibilityNodeInfosByText("安装");Log.d(TAG, "processinstallApplication dialog install ##  " + unintall_nodes.size());if (unintall_nodes!=null && !unintall_nodes.isEmpty()) {AccessibilityNodeInfo node;for(int i=0; i<unintall_nodes.size(); i++){node = unintall_nodes.get(i);Log.d(TAG, "processinstallApplication install " + node.getClassName() + " " + node.getText());if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}if (node.getClassName().equals("android.widget.TextView") && node.isEnabled()) {node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}List<AccessibilityNodeInfo> ok_nodes = event.getSource().findAccessibilityNodeInfosByText("确定");Log.d(TAG, "processinstallApplication dialog ok " + ok_nodes.size());if (ok_nodes!=null && !ok_nodes.isEmpty()) {AccessibilityNodeInfo node;for(int i=0; i<ok_nodes.size(); i++){node = ok_nodes.get(i);Log.d(TAG, "processinstallApplication dialog ok " + node.getClassName());if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}if (node.getClassName().equals("android.widget.TextView") && node.isEnabled()) {node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}List<AccessibilityNodeInfo> next_nodes = event.getSource().findAccessibilityNodeInfosByText("下一步");Log.d(TAG, "processinstallApplication dialog next " + next_nodes.size());if (next_nodes!=null && !next_nodes.isEmpty()) {AccessibilityNodeInfo node;for(int i=0; i<next_nodes.size(); i++){node = next_nodes.get(i);if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}List<AccessibilityNodeInfo> open_nodes = event.getSource().findAccessibilityNodeInfosByText("打开");Log.d(TAG, "processinstallApplication dialog open " + open_nodes.size());if (open_nodes!=null && !open_nodes.isEmpty()) {AccessibilityNodeInfo node;for(int i=0; i<open_nodes.size(); i++){node = open_nodes.get(i);Log.d(TAG, "processinstallApplication dialog open " + node.getClassName());if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}if (node.getClassName().equals("android.widget.TextView") && node.isEnabled()) {node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}List<AccessibilityNodeInfo> com_nodes = event.getSource().findAccessibilityNodeInfosByText("完成");Log.d(TAG, "processinstallApplication dialog com " + com_nodes.size());if (com_nodes!=null && !com_nodes.isEmpty()) {AccessibilityNodeInfo node;for(int i=0; i<com_nodes.size(); i++){node = com_nodes.get(i);Log.d(TAG, "processinstallApplication dialog com " + node.getClassName());if (node.getClassName().equals("android.widget.Button") && node.isEnabled()) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK);}if (node.getClassName().equals("android.widget.TextView") && node.isEnabled()) {node.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}}}}


     


1 0