[[Android]:触发AccessibilityEvent时,TalkBack不讲话]

问题描述 投票:1回答:1

我正在创建一个自定义视图(扩展View类),并使用Accessibility API来了解其工作原理。下面是我的代码,其中:

  1. 我检查MotionEvent等于ACTION_HOVER_ENTER,然后在其中发送TYPE_VIEW_HOVER_ENTER类型的AccessibilityEvent。
  2. 我在AccessibilityEvent中捕获了onPopulateAccessibilityEvent。然后,我将自定义文本添加到事件的文本中,只需添加即可。

结果,当我将鼠标悬停在视图上时,一切都正常(通过日志确认),但是TalkBack不会说我的自定义文本。我可以使“话语提示”说自定义文本的唯一方法是使用setContentDescription("custom text...")

但是,按照我理解API的方式,应该可以根据MotionEvent的类型以及相应地AccessibilityType的类型设置不同的文本。

[我的问题-有人可以向我解释,我如何让TalkBack讲我的自定义文本,我可以根据事件类型来设置该文本?

@Override
    public boolean onHoverEvent(MotionEvent event) {
        final int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_HOVER_ENTER:
                Log.d("test", "onHoverEvent: ACTION_HOVER_ENTER"); // <-- this is triggered correctly on hover enter
                sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
                return true;
        }
        return super.onHoverEvent(event);
    }

    @Override
    public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(event);
        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) {
            Log.d("test", "onPopulateAccessibilityEvent");
            CharSequence text = "this is a test";
            Log.d("test", "text before: " + event.getText()); // text before is empty, i.e. "[]"
            event.getText().add(text);
            Log.d("test", "text after: " + event.getText()); // text after is "[this is a test]", but TalkBack is silent
        }
    }

android accessibility talkback
1个回答
0
投票

参考this answer

您可以尝试通过以下方式启用/禁用辅助功能设置。

Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "pkgname/classname");
Settings.Secure.putString(getContentResolver(), 
    Settings.Secure.ACCESSIBILITY_ENABLED, "1");

其中pkgname是您的软件包名称,而classname是您的辅助服务的类名称。

如果需要启用多个服务,或者不想破坏以前的设置,则可能要使用:来分隔其他服务。

此外,您可能需要作为系统应用程序运行,并且可能需要以下权限

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

这可能不适用于某些版本的Android。

也请参考this question的其他答案

PS。如果它不起作用,也许您可​​以在/data/data/com.android.providers.settings/databases/settings.db/secure中找到运气,这是Android存储安全设置的地方。

© www.soinside.com 2019 - 2024. All rights reserved.