Sagar Nayak Sagar Nayak - 3 months ago 72
Android Question

cacheing of webpage for offline use (android)

i am following this question from stack overflow for my query. the code works fine but when in offline mode it does not load any page , instead it shows no internet connection.

i am doubtful if the webpage is really being written to the cache.

my code is below-

private void openURL() {
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);

if (!isNetworkAvailable()) {
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
Toast.makeText(MainActivity.this, "server offline. loading the cached website", Toast.LENGTH_LONG).show();
}

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


the toast i am displaying is displayed in no internet condition . so the code is working fine but the page is not being loaded.

logcat

W/chromium: [WARNING:aw_network_delegate.cc(75)] http://192.168.1.210/trackme/user/sendpagestest#-102#1
[INFO:browser_view_renderer.cc(185)] [CalculateDesiredMemoryPolicy] [58982400][180]
register, handle(0xb8d834b0) (w:720 h:1280 s:720 f:0x1 u:0x000f02)
cache file failed CRC check
[INFO:CONSOLE(12)] "Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png", source: data:text/html,chromewebdata (12)
[getaddrinfo]: hostname=192.168.1.210; servname=(null); cache_mode=(null), netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
[INFO:SkUtilsArm.cpp(179)] Device supports ARM NEON instructions!
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
D/OpenGLRenderer: Flushing caches (mode 0)
D/OpenGLRenderer: Flushing caches (mode 0)
D/GraphicBuffer: unregister, handle(0xb8d63a28) (w:583 h:88 s:592 f:0x1 u:0x000f02)
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
D/WebView: loadUrl=http://192.168.1.210/trackme/user/sendpagestest
W/chromium: [WARNING:aw_network_delegate.cc(75)] http://192.168.1.210/trackme/user/sendpagestest#-102#1
I/chromium: [INFO:CONSOLE(12)] "Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png", source: data:text/html,chromewebdata (12)
D/libc-netbsd: [getaddrinfo]: hostname=192.168.1.210; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd: [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0


please help me.

thank you

update

i just now checked for google.com and it works fine. but when i do it with facebook.com then the same problem appears.

Answer

after doing some research i found answer to my question.

i explicitly downloaded the webpage into the device and save it. and when the device is in offline mode i display the webpage saved in the device. and when it is online the page is again downloaded and override the previous one.

i used the following code-

to download

InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
       URL url = new URL("http://192.168.1.210/bibhutest.html");
       connection = (HttpURLConnection) url.openConnection();
       connection.connect();
            int fileLength = connection.getContentLength();
            input = connection.getInputStream();
            output = new FileOutputStream("address at which you want to download file");
            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                output.write(data, 0, count);
            }
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            if (connection != null)
                connection.disconnect();

to show the downloaded file

if (!isNetworkAvailable()) {
// from the device when dont have internet
webView.loadUrl("file:////sdcard/android/data/downloads.html");
webView.requestFocus();
}

if (!isNetworkAvailable()) {
//load directly from the internet
webView.loadUrl(url);
webView.requestFocus();
}

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

use the above code according to your own need and tweak it when to download the file and save the file and how to display. apply the appropriate logic in your code.

thank you

Comments