WebView load website when online, load local file when offline

AndroidWebviewLocalOfflineAuto Update

Android Problem Overview


I am actually new to programming in Java but I have been following several solutions to my problem here but didn't find one that suits my case and I can't seem to get the code down correctly.

I would like to have a WebView that opens an online page (for example Google) when the phone is online and open a local HTML page when the phone is offline.

At the same time though I want the phone to overwrite the local page when it is online so that the offline local page is always updated to the last time the phone was connected to the internet.

Any ideas on how this could be done? Some simple pointing to the right direction could help.

Thanks a lot.

Android Solutions


Solution 1 - Android

That sounds like a simple webview caching mechanism to me.

The following should do what you are looking for:

WebView webView = new WebView( context );
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default

if ( !isNetworkAvailable() ) { // loading offline
	webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}

webView.loadUrl( "http://www.google.com" );

The method isNetworkAvailable() checks for an active network connection:

private boolean isNetworkAvailable() {
	ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService( CONNECTIVITY_SERVICE );
	NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
	return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Finally, don't forget to add the following three permissions to your AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Solution 2 - Android

here are occasions that a WebView cannot be cached natively. If the page header contains the following fields, the WebView will not be able to cache the contents from that page. Cache-Control: no-store, no-cache Pragma: no-cache

In this case, youwill have to modify the page property on the server to solve the caching problem.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmstationView Question on Stackoverflow
Solution 1 - AndroidjenzzView Answer on Stackoverflow
Solution 2 - AndroidJeppe LethView Answer on Stackoverflow