我有一个 AndroidAccessibilityService部署到运行 Android 5.0.1 的三星 Note 4。
我使用 WhatsApp 作为测试平台,但这适用于任何应用程序,而且更多的是关于辅助功能服务如何触发事件的问题。
2048 (TYPE_WINDOW_CONTENT_CHANGED)Android 触发的事件不一致。如果我将消息发送到我的 WhatsApp 并将其聚焦并且在 75% 的时间屏幕上触发此事件,有时根本不会触发。
是否有一个原因?可访问性事件是否不可靠..?
此外,4096 (TYPE_VIEW_SCROLLED)当用户滚动或当 WhatsApp 的聊天窗口中出现新的信件时,事件似乎确实会持续触发,但是,似乎没有办法确定设备的当前滚动位置是什么?AccessibilityEvent.getSource()提供对列表的一些元数据的访问(在本例中为 android:id/list),但是没有关于此列表或其子元素的滚动位置的可用信息。子列表与屏幕上显示的内容相关,并且boundsToScreen/Parent无论您是查看列表底部还是中间或顶部,值都是相同的。是否有任何线索可以帮助我从所AccessibilityEventNodeInfo呈现的实例中确定滚动位置?
最后,当2048 (TYPE_WINDOW_CONTENT_CHANGED)事件触发时,有时新元素实际上不可用AccessibiltyEvent.getSource()(即使您通过 while 循环迭代到根元素getParent(),然后再次向下扫描)。在将更改应用于 UI 之前,该事件似乎正在拍摄屏幕快照。Athread.sleep没有帮助 - 看起来AccessibilityEventNodeInfo它更像是一个快照而不是对 UI 的实时访问?有什么办法解决这个问题吗?
android accessibility accessibility-api accessibilityservice android-accessibility
我的程序目的:触发服务中的 BACK 按钮
我尝试了很多方法,没有人能达到这个目的,最后我发现了AccessibilityService,它可能是实现这个功能的最可能的方法。
我创建了这个 AccessibilityService,并测试了它的工作
package com.accessibilityservice;
public class MyAccessibilityService extends AccessibilityService {
public MyAccessibilityService() {
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
@Override
public void onInterrupt() {
}
}
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackSpoken"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="desc"
android:notificationTimeout="100"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />
Run Code Online (Sandbox Code Playgroud)
然后我尝试转向performGlobalAction服务,但它没有执行该操作。
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
MyAccessibilityService mas=new MyAccessibilityService();
mas.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试以不同的方式发送自定义事件,但没有人可以发送到 MyAccessibilityService
@Override
public int onStartCommand(Intent intent, int flags, …Run Code Online (Sandbox Code Playgroud) android accessibility-api android-service accessibilityservice android-accessibility
我想Fragment在 Android Talkback 发布时宣布自己。Activity当在 AndroidManifest 文件的活动标签上添加“android:label”时,它会宣布自己。我该怎么做Fragment?
我有最新版本的Talkback,并宣布"我的顶级文本标题".Android本机行为为我的顶级元素添加了"标题".我找不到一种方法来切换ON/OFF标题声明.是否有API来控制其行为.在之前版本的Talkback版本中,它并没有单独宣布"标题".
我有一个问题说明,我需要在启用“可访问性”设置的情况下运行我的应用程序,以提供反馈意见,但是这里的问题是当我单击TextView其中具有“可扩展性”链接的,然后它会读取全文但不允许我可以在禁用可访问性的同时分别单击该Spannable文本,以使字符串可多跨度或链接可单击。
这是我要String点击的代码:
SpannableString ss = new SpannableString("Android is a Software stack");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
startActivity(new Intent(MyActivity.this, NextActivity.class));
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView textView = (TextView) findViewById(R.id.hello);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.TRANSPARENT);
Run Code Online (Sandbox Code Playgroud) android accessibility-api textview spannablestring android-accessibility
假设我有一个项目列表,每个项目中的一个视图是一条消息,在一个简单的 TextView 中,它填充在代码中(来自后端服务的动态数据)。
<TextView
android:id="@+id/message"
style="@style/DefaultText"
/>
Run Code Online (Sandbox Code Playgroud)
视觉上它不需要标签;列表项布局非常清晰。但是听听 TalkBack 如何读取屏幕,我认为为其添加“标签”或描述会有所帮助。这样 TalkBack 会读到类似的内容:
留言:【实际动态留言内容】
我的问题是:是否可以为 TextView 添加标签/描述,首先,它不会替换TextView 内容,但会与其一起阅读,其次,仅影响 TalkBack(而不是视觉呈现)?
我试过的:
contentDescription对于文本视图。不起作用:如果设置,实际内容没有公布,只是在contentDescription。嗯,也许如果我在代码中设置它,并在实际内容之前添加描述......但是没有更简单的方法吗?labelFor指向@+id/message. 问题是它也被直观地显示出来并搞砸了设计。如果我让它不可见,以一种或其他方式,似乎 TalkBack 也不会读取它。 我想将辅助功能添加到我的Android应用中。为了向用户提供最佳的UX,我需要在屏幕上的所有控件元素中添加focusable="true"和contentDescription标记。问题是,我已经使用过ConstraintLayout。例如,我有一个由两个ImageViews 组成的按钮:
<ImageView
android:id="@+id/outside"
app:layout_constraintTop_toBottomOf="..."
app:layout_constraintBottom_toTopOf="..."
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
style="@style/outsideElement"
/>
<ImageView
android:id="@+id/inside"
app:layout_constraintBottom_toBottomOf="@+id/outside"
app:layout_constraintEnd_toEndOf="@+id/outside"
app:layout_constraintStart_toStartOf="@+id/outside"
app:layout_constraintTop_toTopOf="@+id/outside"
style="@style/insideElement"
/>
Run Code Online (Sandbox Code Playgroud)
现在,当应用“话语提示”或“辅助功能扫描程序”时,它首先显示外部元素,然后显示内部元素。我想让他们都专注。问题在于平面结构。如果将它们都放在RelativeLayout,LinearLayout等等中,则只需要添加focusable="true"到上部布局即可。但是我想保持扁平的结构和ConstraintLayout。知道如何用扁平结构解决吗?提前致谢。
android accessibility android-accessibility android-constraintlayout
以前也有人问过类似的问题,但很久以前没有答案。
第一次加载 webview 时,对讲说 webview 但我希望它什么都不说。
我尝试在 XML 中设置内容描述
android:id="@+id/web"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="CustomText"
Run Code Online (Sandbox Code Playgroud)
但它最后还是说 Webview。也试过importantForAccessbility不,但它也禁用对讲来阅读内容。我错过了什么吗?
android accessibility webview android-webview android-accessibility
我们正在努力使我们的应用程序更易于访问,我们正在考虑的一件事是在从系统设置进行配置时支持更大的字体大小。
我们注意到在 Android 7.0(可能还有更早的版本)上,系统字体大小在我们的应用程序中没有正确应用。我们还注意到一些其他应用程序(例如 gmail)正在正确处理字体大小更改,因此我们的应用程序做错了“某事”。经过一段时间的调查,我们发现使用 androidx 库似乎是原因。
例如,在 Android Studio 下创建一个“hello world”新项目,你会看到一个“use androix artifacts”复选框:
如果您选中“androidx”复选框(不起作用),这将是您的应用程序的结果:

如果您没有选中“androidx”复选框(正常工作),这将是您的应用程序的结果:

如果您选中该框,则生成的应用程序二进制文件将不会在 Android 7.0 上正确应用系统辅助功能字体大小更改,否则它将正常工作。
迁移到 androidx 需要一些工作,因为它是未来(支持库逐渐被弃用),返回并不是一个真正的选择:/
有没有其他人遇到过类似的问题?这可能是 androidx 库的错误吗?
如果有人找到了一种方法来保留 androidx 库并且没有这个错误,我真的很想知道,在此先感谢您!
我的布局中有一个nestedscrollview,其中包含很少的文本、按钮和recyclerviews。
当对讲打开时,我可以遍历所有元素。但我面临一个问题。当我的水平 recyclerview 滚动然后我滑动以听到对讲时,焦点将移动到工具栏的第一项。然后我需要遍历所有可见项以到达水平滚动视图滚动项。
这个问题只出现在nestedscrollview 中的recyclerviews 中。
我在布局中的嵌套滚动视图以这种方式添加:
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
//my contents
</androidx.core.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)
我在布局中的 recyclerview 以这种方式添加:
<LinearLayout
android:id="@+id/photosLL"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/photosRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/list_item_photo" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是预期的行为还是问题,如何解决?
android talkback android-recyclerview android-accessibility android-nestedscrollview