Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android WebView JavaScript from assets

How can I make JavaScript and images on my remote HTML page be loaded from assets folder (or just any local resource)?

like image 681
tomurka Avatar asked Feb 23 '12 13:02

tomurka


2 Answers

Answer:
1. You MUST load the HTML into string:

private String readHtml(String remoteUrl) {
    String out = "";
    BufferedReader in = null;
    try {
        URL url = new URL(remoteUrl);
        in = new BufferedReader(new InputStreamReader(url.openStream()));
        String str;
        while ((str = in.readLine()) != null) {
            out += str;
        }
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return out;
}


2. Load WebView with base URL:

String html = readHtml("http://mydomain.com/my.html");
mWebView.loadDataWithBaseURL("file:///android_asset/", html, "text/html", "utf-8", "");

In this particular case you should have all .js files you want to use on the page to reside somewhere under "assets" folder of project. For example:

/MyProject/assets/jquery.min.js


3. In your remote html page you have to load .js and .css files that reside in your application like:

<script src="file:///android_asset/jquery.min.js" type="text/javascript"></script>

the same applies to all other local resources like images, etc. their path has to start with

file:///android_asset/

A WebView would first load the raw HTML you have provided as string, then pick .js, .css and other local resourses and then would load remote content.

like image 167
tomurka Avatar answered Oct 24 '22 17:10

tomurka


If dynamically creating your HTML and then using loadDataWithBaseURL make sure any local resources e.g. javascript in your assets folder are referred to in the HTML as file:/// (I Spent hours working this out)

like image 2
MLP Avatar answered Oct 24 '22 16:10

MLP