当前位置: 移动技术网 > IT编程>开发语言>Java > AccessibilityService无障碍服务日常笔记

AccessibilityService无障碍服务日常笔记

2020年07月18日  | 移动技术网IT编程  | 我要评论


#AccessbilityService
1. 辅助服务
辅助服务设计的初衷是提供给无法和界面进行交互的残疾用户,用来协助帮助他们进行一些用户交互。后来被开发者用来进行插件开发、监听第三方应用的插件。
继承关系:|public abstract class AccessibilityService
java.lang.Object继承
   android.content.Context
android.content.ContextWrapper
android.app.Service
android.accessibilityservice.AccessibilityService    
2. 生命周期
生命周期遵循Service生命周期
绑定服务后,调用AccessibilityService#onConnected()方法,用户在设置中关闭时,辅助服务功能将停止,或调用AccessibilityService#disableSelf()方法,giant服务会被关闭销毁

<service android:name = “.MyAccessibilityService”
android:permission = “ android.permission.BIND_ACCESSIBILITY_SERVICE” >
<action android:name = “ android.accessibilityservice.AccessibilityService” />
</ intent-filter> 。。。</ service>

##XML属性
android:accessibilityEventTypes 该服务希望接收的事件类型,如中所述 AccessibilityEvent。
android:accessibilityFeedbackType 该服务提供的反馈类型,如中所述 AccessibilityServiceInfo。
android:accessibilityFlags 如中指定的其他标志 AccessibilityServiceInfo。
android:canRequestEnhancedWebAccessibility 属性可访问性服务是否希望能够请求增强的Web可访问性增强功能。
android:canRequestFilterKeyEvents 属性可访问性服务是否希望能够请求过滤关键事件。
android:canRequestTouchExplorationMode 属性可访问性服务是否希望能够请求触摸浏览模式,在该模式下,大声说出触摸的项目并且可以通过手势浏览UI。
android:canRetrieveWindowContent 属性可访问性服务是否希望能够检索活动窗口内容。
android:canTakeScreenshot 属性可访问性服务是否要能够截屏。
android:description 可访问性服务目的或行为的简短描述。
android:interactiveUiTimeout 建议的超时时间(以毫秒为单位),用于 为交互式控件返回合适的值。 android.view.accessibility.AccessibilityManager.getRecommendedTimeoutMillis(int, int)
android:nonInteractiveUiTimeout 建议的超时时间(以毫秒为单位),用于 为不包含交互式控件的UI返回合适的值。 android.view.accessibility.AccessibilityManager.getRecommendedTimeoutMillis(int, int)
android:notificationTimeout 两次相同类型的可访问性事件之间的最短时间(以毫秒为单位)被发送到此服务。
android:packageNames 逗号分隔的程序包名称,此服务希望从中接收事件(对于所有程序包请忽略)。
android:settingsActivity 活动的组件名称,允许用户修改此服务的设置。
android:summary 无障碍服务目的或行为的简要摘要。

android:accessibilityEventTypes参数

<pre><code>
默认
在API级别4中添加
静态 VAL DEFAULT :诠释
如果AccessibilityService给定类型的默认值是。仅当不存在特定于软件包的软件包时,才调用默认服务。如果有多个套餐特定服务,则仅通知较早注册。
值: 1

FEEDBACK_ALL_MASK
在API级别14中添加
静态 VAL FEEDBACK_ALL_MASK :诠释
屏蔽所有反馈类型。
值: -1

也可以看看
#FEEDBACK_SPOKEN#FEEDBACK_HAPTIC#FEEDBACK_AUDIBLE#FEEDBACK_VISUAL#FEEDBACK_GENERIC#FEEDBACK_BRAILLE
FEEDBACK_AUDIBLE
在API级别4中添加
静态 VAL FEEDBACK_AUDIBLE :诠释
表示可听(不说)反馈。
值: 4

FEEDBACK_BRAILLE
在API级别17中添加
静态 VAL FEEDBACK_BRAILLE :诠释
表示盲文反馈。
值: 32

FEEDBACK_GENERIC
在API级别4中添加
静态 VAL FEEDBACK_GENERIC :诠释
表示一般反馈。
值: 16

FEEDBACK_HAPTIC
在API级别4中添加
静态 VAL FEEDBACK_HAPTIC :诠释
表示触觉反馈。
值: 2

FEEDBACK_SPOKEN
在API级别4中添加
静态 VAL FEEDBACK_SPOKEN :诠释
表示语音反馈。
值: 1

FEEDBACK_VISUAL
在API级别4中添加
静态 VAL FEEDBACK_VISUAL :诠释
表示视觉反馈。
值: 8

FLAG_ENABLE_ACCESSIBILITY_VOLUME
在API级别26中添加
静态 VAL FLAG_ENABLE_ACCESSIBILITY_VOLUME :诠释
此标志要求系统范围内的所有音轨均受音量android.media.AudioAttributes#USAGE_ASSISTANCE_ACCESSIBILITY控制android.media.AudioManager#STREAM_ACCESSIBILITY。
值: 128

FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
在API级别16中添加
静态 VAL FLAG_INCLUDE_NOT_IMPORTANT_VIEWS :诠释
如果设置了此标志,那么系统将考虑对可访问性不重要的视图。即,在查询窗口内容以及可访问性服务时,将报告被标记为对可访问性不重要的视图View#IMPORTANT_FOR_ACCESSIBILITY_NO或被View#IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS标记为对可访问性潜在重要的视图,View#IMPORTANT_FOR_ACCESSIBILITY_AUTO系统已通过该视图确定对可访问性不重要。将从他们那里收到可访问性事件。

注意:对于针对Android 4.1(API级别16)或更高版本的可访问性服务,必须为系统明确设置此标志,以考虑对可访问性不重要的视图。对于针对Android 4.0.4(API级别15)或更低版本的可访问性服务,此标志将被忽略,并且所有视图均视为可访问性目的。

通常,对于可访问性不重要的视图是布局管理器,它们不对用户操作做出反应,不绘制任何内容,并且在屏幕内容的上下文中不具有任何特殊的语义。例如,可以将三乘三网格实现为三个水平线性布局和一个垂直布局,或三个垂直线性布局和一个水平或一个网格布局等。在这种情况下,实际的布局管理器用于实现网格配置不重要;而是要有9个均匀分布的元素,这一点很重要。
值: 2

FLAG_REPORT_VIEW_IDS
在API级别18中添加
静态 VAL FLAG_REPORT_VIEW_IDS :诠释
此标志要求AccessibilityNodeInfo由获得的AccessibilityService包含源视图的ID。源视图ID将是格式为“ package:id / name”的完全限定资源名称,例如“ foo.bar:id/my_list”,这对于UI测试自动化非常有用。默认情况下未设置此标志。
值: 16

FLAG_REQUEST_ACCESSIBILITY_BUTTON
在API级别26中添加
静态 VAL FLAG_REQUEST_ACCESSIBILITY_BUTTON :诠释
此标志向系统指示可访问性服务请求在系统的导航区域(如果有)中显示可访问性按钮。
注意:对于定位大于的API的可访问性服务Build.VERSION_CODES#Q,必须在可访问性服务元数据文件中指定此标志。否则,它将被忽略。
值: 256

~~FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY
已在API级别18中添加在API级别26中
已弃用
静态 VALFLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY:整数
弃用:不再使用
值: 8~~   

FLAG_REQUEST_FILTER_KEY_EVENTS
在API级别18中添加
静态 VAL FLAG_REQUEST_FILTER_KEY_EVENTS :诠释
该标志要求系统过滤关键事件。如果设置了此标志,则可访问性服务将在允许其实现全局快捷方式的应用程序之前接收键事件。
想要设置此标志的服务必须通过将属性设置 #canRequestFilterKeyEvents canRequestFilterKeyEvents为true来在其元数据中声明此功能,否则此标志将被忽略。有关如何声明服务的元数据的信息,请参阅{@value android.accessibilityservice.AccessibilityService#SERVICE_META_DATA AccessibilityService#SERVICE_META_DATA}。
值: 32
也可以看看
android.R.styleable#AccessibilityService_canRequestFilterKeyEvents   

FLAG_REQUEST_FINGERPRINT_GESTURES
在API级别26中添加
静态 VAL FLAG_REQUEST_FINGERPRINT_GESTURES :诠释
此标志请求将所有指纹手势发送到辅助功能服务。
想要设置此标志的服务必须通过将属性设置android.R.attr#canRequestFingerprintGestures为true 来声明在其元数据中检索窗口内容的功能,否则此标志将被忽略。有关如何声明服务的元数据的信息,请参阅{@value android.accessibilityservice.AccessibilityService#SERVICE_META_DATA AccessibilityService#SERVICE_META_DATA}。
值: 512
也可以看看
android.R.styleable#AccessibilityService_canRequestFingerprintGesturesandroid.accessibilityservice.AccessibilityService#getFingerprintGestureController()

FLAG_REQUEST_MULTI_FINGER_GESTURES
在API级别30中添加
静态 VAL FLAG_REQUEST_MULTI_FINGER_GESTURES :诠释
该标志要求FLAG_REQUEST_TOUCH_EXPLORATION_MODE启用时启用多手指手势。因此,两指绕过手势将被禁用。如果FLAG_REQUEST_TOUCH_EXPLORATION_MODE禁用,则此标志无效。
值: 4096
也可以看看
#FLAG_REQUEST_TOUCH_EXPLORATION_MODE

FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK
在API级别29中添加
静态 VAL FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK :诠释
显示该对话框时,此标志要求辅助功能快捷方式警告对话框已发出语音反馈。
值: 1024

FLAG_REQUEST_TOUCH_EXPLORATION_MODE
在API级别16中添加
静态 VAL FLAG_REQUEST_TOUCH_EXPLORATION_MODE :诠释
该标志请求系统进入触摸浏览模式。在此模式下,在屏幕上移动的一根手指就像鼠标指针悬停在用户界面上一样。系统还将检测在触摸屏上执行的某些手势并通知此服务。如果至少有一个设置了此标志的可访问性服务,则系统将启用触摸浏览模式。因此,清除此标志并不能保证设备不会处于触摸浏览模式,因为可能会有另一个启用的服务请求该设备。
对于要设置此标志的,针对Android 4.3(API级别18)或更高版本的可访问性服务,必须通过将属性设置 canRequestTouchExplorationMode为true来在其元数据中声明此功能。否则,该标志将被忽略。有关如何声明服务的元数据的信息,请参阅{@value android.accessibilityservice.AccessibilityService#SERVICE_META_DATA AccessibilityService#SERVICE_META_DATA}。
面向Android 4.2.2(API级别17)或更低版本的服务将正常运行。换句话说,在第一次运行它们时,如果指定了此标志,则会向用户显示一个对话框,以确认启用通过触摸进行浏览。
值: 4
也可以看看
android.R.styleable#AccessibilityService_canRequestTouchExplorationMode

FLAG_RETRIEVE_INTERACTIVE_WINDOWS
在API级别21中添加
静态 VAL FLAG_RETRIEVE_INTERACTIVE_WINDOWS :诠释
此标志向系统指示可访问性服务要访问所有交互式窗口的内容。交互式窗口是具有输入焦点的窗口,或者在未启用通过触摸浏览时可以由有视力的用户触摸的窗口。如果未设置此标志,则您的服务将不会接收android.view.accessibility.AccessibilityEvent#TYPE_WINDOWS_CHANGED事件,调用AccessibilityService AccessibilityService#getWindows()将返回一个空列表,AccessibilityNodeInfo#getWindow()并将返回null。
想要设置此标志的服务必须通过将属性设置canRetrieveWindowContent为true 来声明在其元数据中检索窗口内容的功能,否则此标志将被忽略。有关如何声明服务的元数据的信息,请参阅{@value android.accessibilityservice.AccessibilityService#SERVICE_META_DATA AccessibilityService#SERVICE_META_DATA}。
值: 64
也可以看看
android.R.styleable#AccessibilityService_canRetrieveWindowContent

FLAG_SERVICE_HANDLES_DOUBLE_TAP
在API级别30中添加
静态 VAL FLAG_SERVICE_HANDLES_DOUBLE_TAP :诠释
该标志要求FLAG_REQUEST_TOUCH_EXPLORATION_MODE启用该选项后,双击和双击并保持手势将分派给服务,而不是由框架处理。如果FLAG_REQUEST_TOUCH_EXPLORATION_MODE禁用,则此标志无效。

值: 2048
</code></pre>

判断服务是否开启


    public class ActionTool {
    private Context mContext;

    public ActionTool(Context context) {
        this.mContext = context;
    }

    public ActionTool actionTool;

    public static ActionTool create(Context context) {
        return new ActionTool(context);
    }

    String TAG = "permission======";

    //设置服务权限
    public boolean isAccessibilitySettingsOn() {
        int accessibilityEnabled = 0;
        //CustomAccessibilityService:服务名
        final String service = mContext.getPackageName() + "/" + CustomAccessibilityService.class.getCanonicalName();
        try {
            accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(),
                    android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
            Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
        } catch (Settings.SettingNotFoundException e) {
            Log.e(TAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
        }
        TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
        if (accessibilityEnabled == 1) {
            Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------");
            String settingValue = Settings.Secure.getString(mContext.getApplicationContext().getContentResolver(),
                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
            if (settingValue != null) {
                mStringColonSplitter.setString(settingValue);
                while (mStringColonSplitter.hasNext()) {
                    String accessibilityService = mStringColonSplitter.next();

                    Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service);
                    if (accessibilityService.equalsIgnoreCase(service)) {
                        Log.v(TAG, "We've found the correct setting - accessibility is switched on!");
                        return true;
                    }
                }
            }
        } else {
            Log.v(TAG, "***ACCESSIBILITY IS DISABLED***");
        }
        return false;
    }
}
[借鉴文章](https://www.cnblogs.com/lzh-Linux/p/6001628.html)

官网链接
以上笔记,方便以后查询

本文地址:https://blog.csdn.net/d773689630/article/details/107378300

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网