问题
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?
回答1:
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);
}
回答2:
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);
}
}
回答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.
来源:https://stackoverflow.com/questions/22046941/send-accessibility-event-not-linked-to-view