android 官方说明文档,Android官方文档翻译-Accessibility

标签元素

向用户提供解释每个可互动元素的意义和目的有用且形象的标签是非常重要的。这些标签允许屏幕阅读者(比如 TalkBack )正确向用户解释每个控制器的功能。

你可以使用一下两个方法提供元素的标签:

当展示在 Activity 的整个生命周期中都不会改变样式的静态元素时,在 layout 资源文件中添加一个 xml 元素。

当展示在 Activity 生命周期中会改变样式的动态元素时,在改变元素样式的动态逻辑中设置元素标签。

适用于元素标签的实际属性和方法取决于元素的类型:

图形元素,比如 ImageView , ImageButton ,使用 android:contentDescription XML 属性设置静态元素 或 setContentDescription() 方法设置动态元素。

对于简单装饰的图形元素,设置各自的 android:contentDescription XML 属性为 “@null”。如果你的应用只支持 Android 4.1 及以上的设备,你可以设置 Android:isImportantForAccessibility XML 元素为 “no”。

可编辑元素,比如 EditText , 使用hint XML属性设置静态元素或 setHint() 方法设置动态属性。

如果你的应用在 Android 4.2 及以上的设备上安装,对于充当正文标签的 View 对象,使用 android:labelFor 属性。

Accessibility 服务自动捕获 TextView 中的文字,所以你通常不需要标记这些元素

以下示例中,提供分享功能的静态 ImageButton 对象使用一个 “share” 标签:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_alignParentLeft="true"

android:layout_alignParentStart="true"

android:contentDescription="@string/share"

android:src="@drawable/ic_share" />

许多 Accessibility 服务,比如 TalkBack , BrailleBack ,在声明标签后自动声明元素类型,所以你不应改在标签中包括元素类型。

以下例子展示了如何在 Activity 中更新一个显示播放或暂停按钮的动态的 ImageView 对象:

ImageView playPauseImageView = new ImageView();

boolean mediaCurrentlyPlaying = true;

...

private void updateImageButton() {

if (mediaCurrentlyPlaying) {

playPauseImageView.setImageResource(R.drawable.ic_pause);

// In res/values/strings.xml, "pause" contains a value of "Pause".

playPauseImageView.setContentDescription(getString(R.string.pause));

} else {

playPauseImageView.setImageResource(R.drawable.ic_play);

// In res/values/strings.xml, "play" contains a value of "Play".

playPauseImageView.setContentDescription(getString(R.string.play));

}

}

翻译到这里发现并没有什么用==以下翻译内容才是我想要的

建立一个 Accessibility Service

Manifest 声明和权限

提供 Accessibility Services 的应用必须在应用的 mainfest 文件中包括制定的声明告诉系统这是个 Accessibility Services 。

Accessibility Service 声明

为了适配 Android 4.1 及以上设备, mainfest 文件必须通过添加 BIND_ACCESSIBILITY_SERVICE 权限包含一个 Accessibility Services 的意图过滤器保证只有系统可以绑定。

android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"

android:label="@string/accessibility_service_label">

这些声明在 Android 1.6 及以上都需要。

Accessibility Service 配置

Accessibility Services 必须提供指定服务处理处理事件的类型和服务额外信息的配置。这个配置被包含在 AccessibilityServiceInfo 类中。你的服务可以在运行时通过生成实例类并使用 setServiceInfo() 配置信息。但是不是所有的配置选项都可以通过这个方法配置。

Android 4.0 开始,你可以个通过 元素引用一个可以设置服务全部选项的配置文件:

...

android:name="android.accessibilityservice"

android:resource="@xml/accessibility_service_config" />

xml :

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"

/>

注册 Accessibility 事件

服务配置参数一个最重要的功能就是制定你的服务可以处理何种事件。制定服务信息可以是服务相互合作,并允许开发者灵活的制定应用和事件类型:

包名: 指定服务想要处理的应用包名。如果这个参数被省略,你的服务将被认为处理所有应用的事件。这个参数可以通过配置文件的 android:packageNames 设置以逗号分隔的列表,或者使用 AccessibilityServiceInfo.packagenames 设置。

事件类型:指定服务处理事件的类型。这个参数可以通过配置文件中的 android:accessibilityEventTypes 设置以 | 为分隔的list ,或者使用 AccessibilityServiceInfo.eventTypes 设置。

Accessibility Services 方法

onServiceConnected() - (可选) 当系统连接服务成功时回调。使用这个方法完成服务的一次性操作,包括连接用户反馈系统服务,比如音频管理器或者震动器。如果你想在运行时修改服务配置或者进行调整,在这个地方使用 serServiceInfo() 方法。

onAccessibilityEvent() -(必选)当服务检测到一个 Accessibility 事件满足了之前你设置的服务类型,系统将会回调此方法。比如,当用户点击一个按钮或者聚焦在 UI 界面时。当这发生时,系统调用这个方法,通过 AccessibilityEvent() 向用户提供反馈。这个方法在整个生命周期中可以被多次调用。

onInterrupt() -(必选) 当系统想要中断服务提供的反馈,通常时作为用户的操作的回应比如移动焦点时调用这个方法。这个方法将在生命周期期间多次调用。

onUnbind() - (可选) 系统将要关闭服务时调用方法。使用这个方法做一些关闭程序,包括释放用户反馈系统服务,比如音频管理器或者振动器。

获取事件细节

AccessibilityEvent.getRecordCount() and getRecord(int) - 这些方法允许你取回 AccessibilityRecord 对象的 set 列表。

AccessibilityEvent.getSource() - 这个方法返回一个 AccessibilityNodeInfo 对象。这个对象可以获得 View 的布局层次(父布局和子布局)。因此,服务必须通过在配置 XML 文件中添加 canRetrieveWindowContent 属性为 true 来获取权限。否则调用失败。

为用户采取操作

监听手势

在Android 4.1 以后可以监听指定手势。这个特性需要设置 AccessibilityServiceInfo 的flags 为 FLAG_REQUEST_TOUCH_EXPLORATION_MODE:

public class MyAccessibilityService extends AccessibilityService {

@Override

public void onCreate() {

getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;

}

...

}

使用可访问行动

public class MyAccessibilityService extends AccessibilityService {

@Override

public void onAccessibilityEvent(AccessibilityEvent event) {

// get the source node of the event

AccessibilityNodeInfo nodeInfo = event.getSource();

// Use the event and node information to determine

// what action to take

// take action on behalf of the user

nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);

// recycle the nodeInfo object

nodeInfo.recycle();

}

...

}

performAction() 方法允许你在应用中采取行动。如果需要采取一个全局行动,比如返回值 Home 屏,按下返回按钮,打开通知屏或最近应用列表,使用 performGlobalAction() 方法。

使用焦点类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USACO 2.4.1 The Tamworth Two

牛和农夫按照固定的走法在10x10的地图中走,每分钟走一步,求经过几分钟相遇。永远不能相遇输出0. 纯模拟的题。 判断永远不能相遇的方法是如果遇到了一个先前的状态,那么肯定存在循环,必定不能相遇。 程序中把状态表示为牛和农夫的…

013,spring boot下JedisCluster客户端的配置,连接Redis集群

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;pom依赖添加&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <type>jar</typ…

android控件使用大全,Android常见控件使用详解

本文实例为大家分享了六种Android常见控件的使用方法&#xff0c;供大家参考&#xff0c;具体内容如下1、TextView 主要用于界面上显示一段文本信息2、Button 用于和用户交互的一个按钮控件//为Button点击事件注册一个监听器public class Click extends Activity{private Butto…

Ubuntu 12.10使用apt安装Oracle/Sun JDK

Ubuntu 12.10使用apt安装Oracle/Sun JDK apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java6-installerposted on 2014-09-05 13:30 fastdream 阅读(...) 评论(...) 编辑 收藏 …

Afterthought 原来是这样的啊。。。。

$(ProjectDir)Libs\Afterthought\Afterthought.Amender.exe "$(TargetPath)" "$(TargetDir)EntityFramework.Patterns.dll" 我实际上分析代码好久&#xff0c;也没整明白它是怎么运行的&#xff0c;看一下官方文档明白了&#xff0c;原来。。。 Next, add …

查询

增加文本1. create database test删除文本2. drop database test3. create table info( code int primary key, name varchar(20) not null)auto_increment 自增长列foreign key(列名) references 主表名(列名) 外键关系4. drop table infoCRUD:增加语法1.insert into 表…

android 监听界面变化,Android之页面有变化用onWindowFocusChanged来监听权限是否开启...

1 问题我们需要在Activity里面监听网络变化、热点是否开启和关闭、GPS服务是否开启、位置权限是否开启等一些列行为。2 思路方法一&#xff1a;如果是需要启动activity进行权限申请&#xff0c;我们可以用如下组合模式var intent Intent(Settings.ACTION_LOCATION_SOURCE_SETT…

逐步优化求解最大子序列和

求解最大子序列和 tag&#xff1a; 数据结构与算法 最大子序列和问题&#xff1a; 给定序列A1, A2&#xff0c;... AN&#xff0c; 求最大的子序列和。 例如 &#xff1a;   对于序列4, -3, 5, -2, -1, 2, 6, -2&#xff0c; 最大序列和为11&#xff08;4 -3 5 - 2 - 1 2 …

POJ 1228 —— “稳定”凸包

POJ 1228 Grandpas Estate 这是个好题目&#xff0c;同时也是个不和谐的题目&#xff08;不和谐原因是题目出的存在漏洞&#xff0c;数据弱&#xff0c;而且有些条件没给清楚&#xff0c;为了一个SB错误无限WA之后&#xff0c;终于AC&#xff09; 题意就废了我好长时间&#xf…

pythonflaskmock数据_Flask实现简单Mock Server

Mock Server充当的角色&#xff1a;Mock server在实际项目中的意义就相当于数据库。将我想要的数据返回给我就行&#xff0c;我并不关心你怎么逻辑处理的。一般的应用程序请求方式是GET和POST。Flask自带的request使用:request.url获取当前的请求url全路径地址&#xff0c;requ…

在Application_Error事件中获取当前的Action和Control

ASP.NET MVC程序处理异常时&#xff0c;方法有很多&#xff0c;网上也有列举了6种&#xff0c;下面是使用全局处理在Global.asax文件的Application_Error事件中实现。既然是ASP.NET MVC,我需要捕捉到Controller和Action名称。怎样实现可以参考下面代码&#xff1a; 程序运行结果…

android 真机 sqlite3,在android真机上使用sqlite3

#zijun#2013.10.29#QQ:223663737在android真机上使用sqlite3前期准备:1:保证手机已经ROOT操作步骤:1 : 打开CMD2 : 进入android linuxadb shell3 :切换到root权限su - root4 : 修改system目录为可读写权限mount -oremount,rw -t yaffs2 /dev/block/mtdblock3 /system5 :拷贝文件…

【ORACLE技术嘉年华PPT】MySQL压力测试经验

这是2013.11.18在第三届ORACLE技术嘉年华上的主题演讲PPT。点击这里&#xff1a;本地下载PPT。--------------------------------------分割线--------------------------------------知数堂 &#xff08;http://zhishuedu.com&#xff09;培训是由资深MySQL专家叶金荣、吴炳锡…

EditText 空指针问题

今天在Android中碰到了这样一个问题&#xff0c;其实应该很少人会碰到&#xff0c;因为只有像我这种奇葩才会犯这种错误。 但既然解决了&#xff0c;我就想在这里跟大家分享一下&#xff0c;毕竟它困扰了我一个白天啊。。。不多说了&#xff0c;看下面。。。 其实问题很简单&am…

ios跨线程通知_iOS多线程开发(三)---Run Loop(一)

Run LoopRun Loop就是一个事件处理的循环&#xff0c;用来不停的调动工作以及处理输入事件。使用Run Loop的目的就是节省CPU效率&#xff0c;线程在有工作的时候忙于工作&#xff0c;而没工作的时候处于休眠状态。一&#xff0c;Run Loop剖析Structure of a Run Loop and its s…

android播放flv,Android:从url播放flv视频流

我目前有一个应用程序&#xff0c;它可以记录视频并将其上传到我的服务器。在上传视频之后&#xff0c;应用程序会获得一个响应&#xff0c;该响应包含指向该文件的flv流的URL。Android&#xff1a;从url播放flv视频流当我尝试在android默认视频播放器(视频)中打开流时什么也没…

1.关于浏览器

一、认识主流浏览器 Chrome谷歌浏览器Safari苹果浏览器Firefox火狐浏览器Opera欧朋浏览器 二、浏览器内核是什么&#xff1f; 三、五大浏览器&#xff0c;四大内核 四、前端做网页开发用什么浏览器&#xff1f; Chrome谷歌浏览器。

About me [my way]

就要除夕了。假日的到来&#xff0c;心情瞬间就闲适了下来。早早上了床&#xff0c;看看电脑还有30%的电&#xff0c;想到一些事情&#xff0c;顺带纪录一下吧。 今年坚持上班到了除夕的前一天&#xff0c;爸妈来工作的城市陪我过年了。感谢他们。前几天就已经看帖子有说仍在上…

明天要中秋节了,先来到简单“类”的题目

2-1 Point类的定义 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握类与对象的定义&#xff1b; 设计一个点类Time&#xff0c;它具有私有数据成员x(横坐标)、y(纵坐标)&#xff1b;公有成员函数&#xff1a;SetPoint(int,int)用于设置点对象的值&…

实时数据交换平台 - BottledWater-pg with confluent

标签 PostgreSQL , Bottled Water , Kafka , Confluent , IoT 背景 想必大家都在图书馆借过书&#xff0c;小时候有好看的书也会在小伙伴之间传阅。 借书和数据泵有点类似&#xff0c;一份数据通过数据泵实时的分享给订阅者。 例如在IoT的场景中&#xff0c;有流式分析的需求&a…