I'm trying to read a local javascript file (jQuery) stored in assets from an Android webview. I do not want to load-with-base-url since my images and html are served remotely.
To Summarize : - Load local jQuery (in assets folder) into a remotely loaded page in Android webview.
After long hours of browsing going in vain, I decided to put up this question here. Please help.
Thanks!
Define a Javascript Interface like the one below that will read your jquery file from assets directory
class JavaScriptInterface {
@JavascriptInterface
public String getFileContents(){
return readAssetsContent("jquery.js");
}
}
Update WebView to enable JavaScript and to add JavaScriptInterface defined previously...
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "android");
Add javascript code snippet in your remote HTML to read the jquery file content through android JavaScript Interface...
<script type="text/javascript">
var s = document.createElement('script');
s.innerHTML = window.android.getFileContents();
document.head.appendChild(s);
//check if jquery is loaded now...
if(typeof $ != "undefined") {
$(document).ready(function() {
$('body').css('background','green');
});
} else {
document.body.innerText = "jQuery NOT loaded";
}
</script>
First, in your Activity, create the static variable appContext
, which holds the Application Context and function below:
//Initialize Application Context
private static Context appContext;
//Get Application Context (for use in external functions)
public static Context getContext() {
return appContext;
}
...and set the variable in onCreate(Bundle savedInstanceState)
:
//Set application context (for use in external functions)
appContext = this;
Second, create class in separate file below:
File: JavaScriptInterface.java
import android.content.Context;
import android.util.Log;
import android.webkit.JavascriptInterface;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
class JavaScriptInterface {
@JavascriptInterface
public String getFileContents(String assetName){
return readAssetsContent(MainActivity.getContext(), assetName);
}
//Read resources from "assets" folder in string
public String readAssetsContent(Context context, String name) {
BufferedReader in = null;
try {
StringBuilder buf = new StringBuilder();
InputStream is = context.getAssets().open(name);
in = new BufferedReader(new InputStreamReader(is));
String str;
boolean isFirst = true;
while ( (str = in.readLine()) != null ) {
if (isFirst)
isFirst = false;
else
buf.append('\n');
buf.append(str);
}
return buf.toString();
} catch (IOException e) {
Log.e("error", "Error opening asset " + name);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
Log.e("error", "Error closing asset " + name);
}
}
}
return null;
}
}
Third, do not forget to initialize your Webview to use JavaScriptInterface:
//Set JS interface from JS/HTML code execution
mWebView.addJavascriptInterface(new JavaScriptInterface(), "android");
Fourth, call the android method getFileContents()
to load the local resources in your HTML with JavaScript:
<script type="text/javascript">
var s = document.createElement('script');
s.innerHTML = window.android.getFileContents('js/jquery.min.js');
document.head.appendChild(s);
//check if jquery is loaded now...
if(typeof $ != "undefined") {
$(document).ready(function() {
alert("jQuery is loaded!");
});
} else {
alert("jQuery is NOT loaded!");
}
</script>
Note: the local resource in this example is in /assets/js/
sub-folder.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With