Send accessibility event not linked to view
Asked Answered
H

3

7

We're looking to send an accessibility event (which would be picked up by TalkBack etc.) which isn't linked to a view.

For example, how could I send an accessibility event (e.g. talkback saying "Data downloaded") when a AsyncTask has finished?

Herrmann answered 26/2, 2014 at 16:10 Comment(1)
Perhaps reconsider if that's the best place to do it - you'll be providing feedback only to users of TalkBack but not visually? This makes it inaccessible to non-TalkBack users.Nessim
T
12

It looks like the current version of TalkBack ignores announcements if AccessibilityEvent.getSource() returns null, so you're best off using a Toast. This had the added benefit of providing consistent feedback to users whether or not they are using TalkBack.

Toast.makeText(context, /** some text */, Toast.LENGTH_SHORT).show();

Normally, though, you could manually create an AccessibilityEvent and send it through the AccessibilityManager.

AccessibilityManager manager = (AccessibilityManager) context
        .getSystemService(Context.ACCESSIBILITY_SERVICE);
if (manager.isEnabled()) {
    AccessibilityEvent e = AccessibilityEvent.obtain();
    e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
    e.setClassName(getClass().getName());
    e.setPackageName(context.getPackageName());
    e.getText().add("some text");
    manager.sendAccessibilityEvent(e);
}
Trott answered 27/2, 2014 at 6:2 Comment(3)
Not had any luck when trying this, and Talkback doesn't say the text. Any ideas?Herrmann
Sorry, the setAction() call should have been setEventType().Trott
Also, it looks like the most recent version of TalkBack will reject events without a source. This seems like a bug. In the meantime, you might just want to show a Toast.Trott
B
3

You can use the accessibility manager directly (since API 14) like @alanv said. But since API 16, you must provide a view.

final View parentView = view.getParent();
if (parentView != null) {
    final AccessibilityManager a11yManager =
            (AccessibilityManager) view.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);

    if (a11yManager != null && a11yManager.isEnabled()) {
        final AccessibilityEvent e = AccessibilityEvent.obtain();
        view.onInitializeAccessibilityEvent(e);
        e.getText().add("some text");
        parentView.requestSendAccessibilityEvent(view, e);
    }
}
Binni answered 7/1, 2015 at 14:8 Comment(1)
Should the last line here be a11yManager.requestSendAccessibilityEvent(view, e); ?Tribesman
E
-3

Try use a Broadcast message, you can send a Intent to Broadcast Receiver, then in the Receiver you can launch a notification or something.

Eurydice answered 26/2, 2014 at 16:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.