Accessibility and Android WebView

16,233

Solution 1

The Android webview accessibility is enabled via javascript injection in Honeycomb and above (as pointed out by alanv). The user must enable it by:

  • Turning on Accessibility mode, including 'Explore by Touch' in 4.0+.
  • Enabling 'Enhanced Web Accessibility', or, on older devices, 'Inject Web Scripts'.

This works by injecting javascript into each loaded pages via <script> tags. Note that you will have to be careful, as not all content will play nice with this javascript, and the injection will fail in some edge cases.

Solution 2

You can extend the WebView class to implement Accessibility API methods.

http://developer.android.com/guide/topics/ui/accessibility/apps.html#custom-views

Solution 3

I also ran into this issue on 4.0 devices. I ended up placing a TextView on top of the WebView, making the TextView background and text transparent. The text content of the TextView being set to the content of WebView with all HTML tags stripped out.

A most inelegant solution, I know, but hey it works....

Solution 4

No, the WebView is not accessible from the built-in TalkBack service, at least as of Android version 4.0. Instead, blind users are instructed to use something like Mobile Accessibility for Android, which provides a spoken browsing interface. I would suggest making your content available to other processes, allowing blind users to view the content in their browser of choice. I did this by starting an intent to view the content:

public static void loadUrlInBrowser(Context c, Uri uri) {
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setDataAndType(uri, "text/html");
    c.startActivity(i);
}

Alternatively, you can set the content description of the WebView. Note that this only seems to work in pre 4.0 versions of android. I've found that 4.0 devices keep either say WebView or nothing at all.

Solution 5

I know how to access web view content by Accessibility API, when AccessibilityNodeInfo.getText() is null or "null", call AccessibilityNodeInfo.getContentDescription().

simple code:

private String getTextOrDescription(AccessibilityNodeInfo info) {
    String text = String.valueOf(info.getText());

    if (isEmptyOrNullString(text)) {
        text = String.valueOf(info.getContentDescription());
    }
    return text;
}

private boolean isEmptyOrNullString(String text) {
    if (TextUtils.isEmpty(text) || text.equalsIgnoreCase("null")) {
        return true;
    }
    return false;
}

getContentDescription() can get the web view content.

sorry for my poor english.

Share:
16,233

Related videos on Youtube

Nemo
Author by

Nemo

Updated on June 06, 2022

Comments

  • Nemo
    Nemo about 2 years

    Is Accessibility enabled for Android WebView? Can anyone tell how to make a WebView accessible?

  • alanv
    alanv almost 12 years
    WebView is keyboard accessible in Honeycomb and above by enabling Settings > Accessibility > Inject web scripts. In Jelly Bean and above, WebView is keyboard accessible (and touch explorable when JS is enabled) by enabling Settings > Accessibility > Enhance web accessibility.
  • Dr.jacky
    Dr.jacky over 2 years
    @alanv Is both paths the same on newer Android APIs? I cannot find them on Android 11!