AccessibilityService无障碍开发简单的例子

创建一个无障碍服务 现在清单文件里声明 以便android 系统把此应用程序作为无障碍服务处理

为了兼容android 4.1 以及更高版本 文件中必须声明BIND_ACCESSIBILITY_SERVICE

    <application>
    <service
            android:name=".services.GetInFoService"
            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/my_services_config" />
        </service>
    </application>

文中的@xml/my_services_config 实在资源文件夹里创建的xml 如图:
这里写图片描述
·my_services.config 文件 内容·

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags=""
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_description"
    android:notificationTimeout="100"
    android:packageNames="com.projectprint.pver.hemupro" />

packageNames :监听你app 的包名 多个包可用 “,”
隔开例如:com.tencent.mobileqq,com.projectprint.pver.hemupro

代码:


public class GetInFoService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {

// 获取激活当前窗体的激活点应用的节点
        if (getRootInActiveWindow() == null) {
            return;
        }
        List<AccessibilityNodeInfo> mList = getRootInActiveWindow().findAccessibilityNodeInfosByText("Hello");  //根据文字差早
        for (AccessibilityNodeInfo aInfo : mList) {

            // 执行按钮点击行为
            if (   aInfo.getClassName().equals("android.widget.TextView")&& aInfo.isEnabled()) {
                aInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);//执行命令
            }
        }

        int eventType = event.getEventType();
        switch (eventType) {
            case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:// 通知栏事件
                break;
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED://窗体状态改变
                break;
            case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED://View获取到焦点
                break;
            case AccessibilityEvent.TYPE_GESTURE_DETECTION_START:
                break;
            case AccessibilityEvent.TYPE_GESTURE_DETECTION_END:
                break;
            case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
                break;
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                break;
            case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
                break;
            case AccessibilityEvent.TYPE_VIEW_SCROLLED:
                break;
            case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:

                break;
        }
    }

    @Override
    public void onInterrupt() {
        Log.e("Tag","interrupt");
    }

}


aInfo.performAction 方法允许无障碍服务在应用中执行操作 如果无障碍服务需要去执行全局操作 例如导航到主屏幕案件返回打开屏幕通知或者最近应用列表 使用 performGlobalAction
启动 把 辅助功能对应的这个app辅助模式开启即可启动改服务

getEventType() 该事件类型
getSource() 获取事件源对应的结点信息
getClassName() 获取事件源对应类的类型
getText() 获取事件源的文本信息
isEnabled() 事件源(对应的界面控件)是否处在可用状态
getItemCount() 如果事件源是树结构,将返回该树根节点下子节点的数量

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值