I'm developing an javascript/HTML application with jquerymobile which makes ajax requests to a remote server. The application works fine on Chrome (only launching chrome with web security disabled) but when I embed it within the assets/ directory of an Android application (a simple webview) the remote ajax calls fail. Thus I guess it may be a cross domain issue. I'm aware that phonegap does not have this issue but I would like not to use phonegap if possible. So the question is: how do I disable cross domain protection in an Android webview application?
this is the Activity code:
public class Moby extends Activity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_moby);
WebView mbrowser = (WebView) findViewById(R.id.webView1); //get the WebView from the layout XML
if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN)
mbrowser.getSettings().setAllowUniversalAccessFromFileURLs(true);
//mbrowser.setWebChromeClient(new WebChromeClient());
mbrowser.setWebViewClient(new WebViewClient());
mbrowser.loadUrl("file:///android_asset/index.html"); //set the HTML
WebSettings settings = mbrowser.getSettings();
settings.setJavaScriptEnabled(true);
}
}
<uses-permission android:name="android.permission.INTERNET" />
And I already set the jquerymobile cross domain parameters in my html pages:
<script src="script/jquery-1.8.2.js"></script>
<script>
$(document).bind("mobileinit", function(){
$.support.cors = true;
$.mobile.allowCrossDomainPages = true;
});
</script>
<script src="script/jquery.mobile-1.2.0.js"></script>
Try this
WebView web=(WebView) findViewById(R.id.webView1);
web.getSettings().setJavaScriptEnabled(true);
I don't have enough points to post this as a comment, however, please have a look at the following:
ajax working on some Android devices, not in other
Specifically, the following is required on Chrome based webViews:
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
Edit: sorry, I just saw you're already doing this -- I tested this on my end and it seems to have solved my issue (was getting an access-control-allow-origin error when loading local links via ajax).
I had the same problem and I fixed it by overriding shouldInterceptRequest in my WebViewClient. I intercept the ajax call and do it in java. You have to do the same for POST methods
private class MyWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView webView, String url) {
Log.d("test", "onPageFinished");
loadWebViewJavascriptBridgeJs(webView);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView webview, WebResourceRequest webrequest)
{
Log.d("test", "shouldInterceptRequest");
return this.handleRequest(webrequest.getUrl().toString());
}
@NonNull
private WebResourceResponse handleRequest(@NonNull String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestProperty("User-Agent", "");
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
InputStream inputStream = connection.getInputStream();
return new WebResourceResponse("text/json", "utf-8", inputStream);
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
catch (ProtocolException e) {
e.printStackTrace();
return null;
}catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
When I inticiate my webview, I instanciate my WebViewClient
mWebView.setWebViewClient(new MyWebViewClient());
In your AndroidManifest.xml, do you have this line :
<uses-permission android:name="android.permission.INTERNET" />