手机上没有应用的辅助功能选项没有了

posts - 17,&
comments - 6,&
trackbacks - 0
AccessibilityService是一个辅助类,可以监听我们手机的焦点,窗口变化,按钮点击等等。实现它的服务需要在手机设置里面-&辅助功能在这里面找到你自己实现的辅助类,然后打开它就可以进行我们一系列的监听,这个功能google的出发点是给那些肢体上有障碍的人使用的,比如手指不健全的用户,怎么才能滑动屏幕,然后打开一个应用呢?那么辅助功能就是干这些事,他的功能其实就是可以概括两句话:
第一、寻找到我们想要的View节点
第二、然后模拟点击,实现特定功能
我们知道Android中的View体系是一个树形结构,那么每一个View就是一个节点。所以我们可以查找到指定的节点,那么我们该如何查找到我们想要的节点呢?这里我们先看一下辅助功能(AccessibilityService)的用法。
第一步、我们需要集成AccessibilityService类
我们需要自定一个Service然后继承AccessibilityService,当然还需要在AndroidManifest.xml中声明这个服务:
&application&
&service android:name=".MyAccessibilityService"
android:label="@string/accessibility_service_label"&
&intent-filter&
&action android:name="android.accessibilityservice.AccessibilityService" /&
&/intent-filter&
&mate-data
android:name="android.accessibilityservice"
anroid:resource="@xml/accessibility"/&
&/service&
&uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /&
&/application&
在&application&标签下添加指定了AccessibilityService的子类MyAccessibilityService,同时加入相应的权限。
&uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /&
当然还要一个meta-data的声明,这个声明是对这个AccessibilityService的配置。我们看一下配置文件内容:
(注:从Android4.0开始,开发者可以通过在AndroidManifest里添加&meta-data&标签,在标签里指出配置文件的位置)
&?xml version="1.0" encoding="utf-8"?&
&accessibility-service xmlns:android="/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/desc"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" /&
这里我们看到有很多选项,我们看一下常用的几个属性:
1、android:accessibilityEventTypes="typeAllMask"看属性名也差不多可以明白,这个是用来设置响应事件的类型,typeAllMask当然就是响应所有类型的事件了。当然还有单击、长按、滑动等。
2、android:accessibilityFeedbackType="feedbackSpoken"设置回馈给用户的方式,有语音播出和振动。可以配置一些TTS引擎,让它实现发音。
3、android:notificationTimeout="100"响应时间的设置就不用多说了
4、android:packageNames="com.example.android.apis"可以指定响应某个应用的事件,这里因为要响应所有应用的事件,所以不填,默认就是响应所有应用的事件。比如我们写一个微信抢红包的辅助程序,就可以在这里填写微信的包名,便可以监听微信产生的事件了。我们这些配置信息除了在xml中定义,同样也可以在代码中定义,我们一般都是在onServiceConnected()方法里进行
protected void onServiceConnected() {
AccessibilityServiceInfo info = getServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
setServiceInfo(info);
info.packageNames = new String[]{"xxx.xxx.xxx", "yyy.yyy.yyy","...."};
setServiceInfo(info);
super.onServiceConnected();
在子类MyAccessibilityService里实现几个重要的重载方法: & & & & &onServiceConnected() - 可选。系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置工作。 & & & & &onAccessibilityEvent() - 必须。通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。 & & & & &onInterrupt() - 必须。这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。
& & & & &onUnbind() - 可选。在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。
2、这里我们一般都会在这里写上我们需要监听的应用的包名,但是有时候我们需要监听多个应用,那么这时候我们该怎么办呢?
第一种:我们在代码中注册多个应用的包名,从而可以监听多个应用:
protected void onServiceConnected() {
AccessibilityServiceInfo info = getServiceInfo();
//这里可以设置多个包名,监听多个应用
info.packageNames = new String[]{"xxx.xxx.xxx", "yyy.yyy.yyy","...."};
setServiceInfo(info);
super.onServiceConnected();
第二种:我们在onAccessibilityEvent事件监听的方法中做包名的过滤(这种方式最常用)
public void onAccessibilityEvent(AccessibilityEvent event) {
String pkgName = event.getPackageName().toString();
if("xxx.xxx.xxx".equals(pkgName)){
}else if("yyy.yyy.yyy".equals(pkgName)){
}else if("....".equals(pkgName)){
第三步、在onAccessibilityEvent方法中监听指定的事件
这里面最重要的部分就是onAccessibilityEvent这个回调函数,当我们注册了监听事件的时候,当有事件发生就会通知我们这个函数,但是一定要注意这个函数通知是异步的,当然很多朋友就会问这个是怎么通知到这里来的呢?他是通过AccessibilityDelegate这个代理类,发送出来的,这个类有个方法sendAccessibilityEvent可以发送事件。那这个类又怎么和我们的窗口联系呢?这里举个例子。比如我们的View类里面有个setAccessibilityDelegate这个方法,是不是这下一切都明了了呢?然后就是调用我们的find函数去当前节点里面找到我们需要的节点信息。
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
这个事件类型很多的,我们可以查看AccessibilityEvent类的源码
第四步、查找到我们想要处理的节点View
这里系统提供了两个方法让我们来进行查找想要的节点View
第一种是通过节点View的Text内容来查找
findAccessibilityNodeInfosByText("查找内容")
这种方式查找,就是像TextView,Button等View有文本内容的,可以使用这种方式快速的找到。
第二种是通过节点View在xml布局中的id名称
findAccessibilityNodeInfosByViewId("@id/xxx")
这个一般很难知道,但是我们在查找系统控件的时候还是可以做的,因为系统的控件的id是可以知道的,而且是统一的。(关于这两个方法我们在写网页爬虫程序的时候可能知道,在html中通过tag/name/id等信息可以找到一个节点,原理都类似)
第五步、模拟点击指定事件
我们找到我们想要的View节点,调用方法模拟事件:
performAction(AccessibilityNodeInfo.ACTION_CLICK)
调用这个方法即可,当然这里的参数就是指定事件的名称,这个和AccessibilityEvent中监听的那些事件是一一对应的,这里是模拟点击事件,我们当然可以模拟View的滚动事件,长按事件等。
阅读(...) 评论() &1602人阅读
android(18)
文章连接:
(该文章是前些时日的总结,今日重新翻到,现贴出来分享给大家,欢迎指正~)
一般情况下,我们正常使用手机时,是涉及到不这块功能的。因为该功能主要是为了方便具有正常使用手机障碍的一类人群,例如:具有听觉障碍或视觉障碍以及体能障碍的人群,或者在特定场景下(比如:会议中)才会使用的。由于该模块需要获取系统级的事件或权限,故对于第三方开发的服务性应用,是需要在Settings—&Accessibility中进行开关设置的。只有手动打开相应应用服务的开关,该应用才可以正常运行。通过对源码的分析,以及阅读google的关于该模块的3篇主流文档:
《Making Applications Accessible》
Development practices and API features to ensure your application is accessible to users with disabilities.
《Accessibility Developer Checklist》
A checklist to help developers ensure that their applications are accessible.
《Building Accessibility Services》
How to use API features to build services that make other applications more accessible for users.
一、辅助功能模块流程
首先需要说明的是辅助共能模块是加载在一个Fragment中的,是Android Settings中的一个小模块,是其中众多Fragment中的一个。该模块的流程大致可以分为2部分,整体结构比较简单,但其中所涉及的内容细节却颇为广泛。
加载并更新布局——
该部分是在Fragment生命周期中的onCreate阶段完成,对应的加载布局文件为R.xml.accessibility_settings,加载完成后并对其中各preference条目进行了初始化。
加载并更新应用——
该部分放在了onResume阶段完成,干的活主要是加载服务性应用,并更新辅辅助功能涉及到的所有应用(包括系统级和服务级应用)。
下面分别进行详细分解说明:
1)、加载并跟新布局
该部分也分为两个阶段:加载和更新。
对于加载,由于所加载文件是由PreferenceScreen以及PreferenceCategory“堆砌”而成,所以,这里主要涉及到的就是Preference控件的理解。详见sdk中对应控件讲解。
更新阶段主要是findPreference的操作,唯一需要注意的是此时的服务性PreferenceCategory中还没有任何应用添加,此时对应的服务性的category为空,所更新的大部分工作是对系统性应用布局的更新。
2)、加载并更新应用
由于该内容是在onResume阶段进行,所以,该阶段完成后,正辅助功能的Fragment就处于运行状态了。
该部分同样分为两个阶段:加载和更新。
加载——此时加载的就主要是已经安装了的服务性的应用了,具体流程较为简单,大致如下:
新建一个set实例installedServices,并清空,用来存储安装过的service;
通过AccessibilityManager实例获取当前AccessibilityServiceList,并存于List实例installedServiceInfos中;
获取installedServiceInfos长度,即当前安装service数目;
遍历installedServiceInfos,并逐个将已安装的service添加到installedServices中。
更新——该部分分为对服务性应用和系统级应用的更新。
服务性应用更新:updateServicesPreferences()。
不作过多解析,流程图如下:
系统性应用更新:updateSystemPreferences()(略)
二、如何创建辅助功能应用
通常开发辅助功能的应用无需添加太多的代码,但,下面的步骤确实必须的。
1)、在AndroidManifest.xml文件中声明并给出权限:
如果希望有个服务成为辅助性服务,必须在其对应的manifest文件中进行一个服务性的声明,下面给出添加辅助性服务中的必须项和可选项设置。
a、辅助性服务的声明:
为了被当作一个辅助性服务,在应用程序的maninfest中,必须包括服务元素(而不是活动元素)。此外,在服务元素中,必须包含辅助性服务的intent filter。为了与Android 4.1以上版本的兼容性,manifest中需要指定BIND_ACCESSIBILITY_SERVICE 权限,以下示例:
android:name=".MyAccessibilityService"
android:label="@string/accessibility_service_label"&
android:name="android.accessibilityservice.AccessibilityService" /&
android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /&
(注意:这些声明所需的所有辅助性服务部署在Android 1.6(API级别4)以上)
b、无障碍服务配置
辅助性性服务还必须提供一个指定辅助性服务处理事件的类型的配置和额外的信息服务。一个辅助性服务的配置是包含在 AccessibilityServiceInfo类中。你的服务可以使用这个类的一个实例,在运行时setServiceInfo()来构建和设置一个配置。然而,并非所有的配置选项可以使用这种方法。从Android 4.0,您可以在你的mainifest中包含一个元素引用一个配置文件,它允许您为您的辅助性服务设置整个范围的选项,如下例所示:
&service android:name=".MyAccessibilityService"&
&meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" /&
&/service&
这个 meta-data元素指的是在应用程序的资源目录创建的一个XML文件。(/res/xml/accessibility_service_config.xml )
下面代码展示了服务配置文件的示例内容:
xmlns:android="/apk/res/android"
android:description="@string/accessibility_service_description"
android:packageNames="com.example.android.apis"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
其他配置信息的设置请参照AccessibilityServiceInfo类。
2)、注册辅助性事件
该环节是最重要的一个环节,主要功能是过滤特定服务性事件类型。在进行过滤时,主要通过包名和事件类型进行。
包名——指定你想要处理的辅助性服务的应用程序的包名。如果省略该参数,你的辅助性服务被认为是对于任何应用程序的辅助性的事件提供服务。这个参数可以在辅助性性服务配置文件 中,android:packageNames属性来设置,这个属性用逗号分隔多个包名,或者使用 AccessibilityServiceInfo.packageNames 设置。
事件类型——指定你想要你的服务来处理的辅助性活动的类型。这个参数可以设置在辅助性服务配置文件中,使用 android:accessibilityEventTypes属性,用|分隔的字符(例如accessibilityEventTypes = ” typeViewClicked | typeViewFocused”),或使用AccessibilityServiceInfo.eventTypes设置。
( 注意:,如果服务提供不同的反馈类型,Android框架分派辅助性事件给多个辅助性服务。然而,如果两个或多个服务提供相同的反馈类型,那么只有第一个注册服务接收事件。)
3)、实现辅助性服务的方法
一个辅助性服务必须继承自AccessibilityService类,并必须重写如下方法,也是该类的生命周期的表现方法,同时构成了辅助性服务应用的基本框架:
当服务开启时——可选
onServiceConnected():当应用成功连接到你的辅助性服务时,系统调用该方法。
当服务运行时——必须
onAccessibilityEvent():当系统检测到一个匹配你辅助性服务过滤器中设置参数的AccessibilityEvent时,调用该方法,运行时多次调用。
onInterrupt():当你的服务对系统事件的反馈被中断时,调用该方法。该方法同上面方法一样,也是被多次调用的。
当服务结束时——可选
onUnbind():在系统将要关闭这个AccessibilityService会被调用。在这个方法中可以进行一些释放资源的工作
四、Demo实例——ClockBackService
该实例是移植的Android自身的一个demo,为了进一步说明该类应用的创建步骤,下面对该demo进行解析说明。
【附件连接】
1)、在AndroidManifest.xml文件中声明并给出权限:
[AndroidManifest.xml]
android:name=".ClockBackService"
android:label="@string/accessibility_service_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"&
android:name="android.accessibilityservice.AccessibilityService" /&
为了给读者一个可视化的界面,源代码中是带有一个Activity的,不过在实际开发中可以不加,在此也不作说明。其中BIND_ACCESSIBILITY_SERVICE权限是重点。
2)、注册辅助性事件
该实例注册事件是在onServiceConnected()阶段进行的,集中于configureForRingerMode()函数中。主要事件都可以在ringerMode中发出,该应用负责接收和接收后的处理。
[ClockBackService.java]
private void setServiceInfo(int feedbackType) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.feedbackType = feedbackT
info.notificationTimeout = EVENT_NOTIFICATION_TIMEOUT_MILLIS;
info.packageNames = PACKAGE_NAMES;
setServiceInfo(info);
其中包名使用PACKAGE_NAMES宏进行了自定义:
private static final String[] PACKAGE_NAMES = new String[] {“com.android.alarmclock”, “com.google.android.deskclock”, “com.android.deskclock”};即该应用只为上面3个包的应用提供辅助服务。
事件类型是AccessibilityEvent.TYPES_ALL_MASK,info.feedbackType = feedbackT即该应用接收上面3个包的所有feedbackType类型的事件(详见AccessibilityServiceInfo类)。
3)、实现辅助性服务的方法
在该demo中,重构了如下4个方法:
onServiceConnected()——虽然在开发中该方法可以省略不写,但在这里,该方法尤其重要,因为接收处理事件之前的配置全部放在了这里。
onAccessibilityEvent()——上面配置完了后,接下来就是服务性应用开始服务的时候了。该函数是一个回调函数,每当符合上面设置条件的事件被接收到时,都会执行一次该方法。
onInterrupt()——每当上面的事件在处理过程中被打断,该方法就会被执行一次。
onUnbind()——该函数是在用户关闭“设置—&辅助功能—&ClockBack”中的开关时执行的。通过源码可以看出,在这里,停掉了TTS服务,注销了广播接收者mBroadcastReceiver,最后将初始化标志位置为false。
4)、测试运行
打开“设置—&辅助功能—&TalkBack”开关,操作时钟应用,抓取应用程序log。
对应部分log如下:
如上主要总结了关于辅助功能的启动流程,以及辅助性应用的创建方法。在此之外还有关于该功能的测试,详见sdk中的“Accessibility Testing Checklist”片段。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23557次
排名:千里之外
原创:19篇
(1)(2)(3)(2)(11)(1)(2)(2)请 登录 后使用快捷导航没有帐号?
1跳转至页
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
产品模块:其他功能建议:金立的手机,辅助功能里怎么没有服务现象设置,如何解决,别的所有的安卓手里辅助功能都能找到服务现象,到金立怎么就没有了,怎么不添加上,买的金立真的好后悔,刚才是没注意后来发现的,真是让人最了,
想要开发组更重视你的建议吗?赶紧点击吧!
amigo OS,够朋友的手机操作系统。
版本amigo2.0
在线2 小时
主题帖子积分
LV1 似曾相识, 积分 17, 距离下一级还需 83 积分
在线2 小时
*#*#452789#*#*拨号键盘输入就可以了
来自ELIFE S系 5.5mm领袖气质 全球至薄手机 S5.5
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
开发者选项里&&调试应用里 没有开服务,给软件开服务没有提示设置
amigo OS,够朋友的手机操作系统。
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
*#*#452789#*#*拨号键盘输入就可以了
开发者选项里&&调试应用里 没有开服务,给软件开服务没有提示设置
amigo OS,够朋友的手机操作系统。
版本amigo3.0
在线4168 小时
星座狮子座
主题帖子积分
LV7 莫逆之交, 积分 40669, 距离下一级还需 4331 积分
在线4168 小时
签到567 次心情哎呀妈呀 ...
辅助程序中的服务阉割了
所以没有了~~
amigo2.0全部都没有的哦亲
& && && && && && && &&& ↑&&↑&&↑&&↑&&↑&&↑&&点击关注我&&↑&&↑&&↑&&↑&&↑&&↑
“总有一个人会改变自己,放下底线来纵容你,不是天生好脾气,只是怕失去你,才宁愿把你越宠越坏,困在怀里。
所谓性格不合,只是不爱的借口。”&&---—---—---& &嗯,总有个人会纵容你的任性,许你一世欢颜。
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
要求添加,什么破系统
来自amigo社区手机版
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
逝去的回忆 发表于
辅助程序中的服务阉割了
所以没有了~~
amigo2.0全部都没有的哦亲
要求添加回去,啊啊啊啊啊啊
来自amigo社区手机版
版本amigo3.0
在线4168 小时
星座狮子座
主题帖子积分
LV7 莫逆之交, 积分 40669, 距离下一级还需 4331 积分
在线4168 小时
签到567 次心情哎呀妈呀 ...
逝去的回忆 发表于
辅助程序中的服务阉割了
所以没有了~~
这个添加好像需要做整包
所以amigo2.0都不会加入了吧
& && && && && && && &&& ↑&&↑&&↑&&↑&&↑&&↑&&点击关注我&&↑&&↑&&↑&&↑&&↑&&↑
“总有一个人会改变自己,放下底线来纵容你,不是天生好脾气,只是怕失去你,才宁愿把你越宠越坏,困在怀里。
所谓性格不合,只是不爱的借口。”&&---—---—---& &嗯,总有个人会纵容你的任性,许你一世欢颜。
版本amigo3.0
在线688 小时
星座天秤座
主题帖子积分
LV6 心有灵犀, 积分 11271, 距离下一级还需 13729 积分
在线688 小时
签到685 次心情哥签的不 ...
amigo2.x系统去掉了这个……没有解决办法了~
为什么我的眼里常含泪水?
因为我对这系统爱得深沉!
机型其它机型
版本amigo2.0
在线9 小时
星座射手座
主题帖子积分
LV2 萍水相逢, 积分 101, 距离下一级还需 199 积分
机型其它机型
在线9 小时
签到6 次心情今日求财 ...
301用户反馈升级啊
来自amigo社区手机版
1跳转至页
二级签到勋章
amigoOS社区二级签到勋章,由一级签到勋章进化而来,签到经验值≥50
内测团勋章
成为amigo内测团正式成员,为amigoOS内测版建言献策,贡献突出,故获此殊荣
社区内测纪念勋章
amigo社区封闭性测试专属勋章(仅300枚),已绝版
社区元老勋章
这是一位为社区建设立下汗马功劳的元老(仅20枚),已绝版
帮帮团勋章
这是一位有爱心、无私奉献的amigo帮帮团成员,报名参加帮帮团即可获得
荣誉内测组勋章
尊贵的荣誉内测组成员身份象征,由内测团勋章进化而来
Ami之星勋章
这枚勋章是为了表彰为社区做出卓越贡献的amigo用户
Ami达人勋章
这枚勋章是为了表彰为社区做出极大贡献的特殊组成员
优秀版主勋章
优秀社区版主荣耀证明
OS一周岁纪念勋章
- ,你我共同见证了amigoOS的成长!
你没有看错,这是一位签到之王,毅力的化身、无所不成!需要签到经验10000以上
六级签到勋章
amigoOS社区六级签到勋章,由五级签到勋章进化而来,签到经验值≥3000
友情链接:
网络通信出现障碍,请检查网络情况或稍后再试哦!
活动已结束
活动已经结束了,客官下次活动再来吧!
活动还没有开始
晚点再来吧!
已经领取过
快去看帖\回帖找找其他福袋吧!

我要回帖

更多关于 手机没有辅助功能 的文章

 

随机推荐