如何在Android应用程序的在线和离线模式下加载或检索网页?

我需要加载和检索Android设备的内部或外部内存的HTML网页。 我需要的是在Android下载和检索网页使用networking视图。

有很多类似于下载或保存网页的重复问题。 但没有任何答案帮助我。 引导我!

提前致谢。

Solutions Collecting From Web of "如何在Android应用程序的在线和离线模式下加载或检索网页?"

我不知道这个解决scheme是否适合你。如果你想在离线mod和在线mod中查看一个网站,你可以使用一个networking爬虫从网站获取所有的数据。 这是一个Androidnetworking爬虫的示例项目。之后,您可以从url或本地内存中加载一个网站,根据您的networking可用性。

从加载的WebView获取HTML代码

将string保存为html文件android

有了上述两个链接就可以达到你的要求,你可以将html内容存入文件,然后存入内部存储,然后你就可以离线加载了。

WebView可以加载和渲染remotelocal html页面,并且还支持'data' scheme URL

存储选项

共享首选项 (在你的情况下没有用)

将私有原始数据存储在键值对中。

内部存储 (为您的情况推荐)

将私人数据存储在设备内存上。

外部存储 (您可以使用但不build议使用)

将公共数据存储在共享的外部存储上。

SQLite的数据库 (你可以在你的情况下使用,但不推荐)

将结构化数据存储在专用数据库中。

networking连接 (您可以使用,但不能在离线模式下工作)

使用您自己的networking服务器将数据存储在networking上。

您可能想尝试使用设置到您的WebViewWebViewClient shouldInterceptRequest方法。 它可以让你知道所有在html加载过程中加载的资源。 所以你可以做这样的事情:

 WebViewClient webViewClient = new WebViewClient() { @TargetApi(VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { WebResourceResponse response = null; if ("GET".equals(request.getMethod())) { try { response = getWebResponse(view.getContext().getApplicationContext(), request.getUrl().toString()); } catch (Exception e) { Log.e(TAG, "Error while overriding getting web response", e); } } return response; } @SuppressWarnings("deprecation") @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = null; try { response = getWebResponse(view.getContext().getApplicationContext(), url); } catch (Exception e) { Log.e(TAG, "Error while overriding getting web response", e); } return response; } WebResourceResponse getWebResponse(Context context, String url) { // YOUR IMPLEMENTATION that will save resource located at passed url } } webView.setWebViewClient(webViewClient); 

这听起来像一个简单的webviewcaching机制给我。

尝试这个

  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 ); } 

方法是NetworkAvailable()检查一个活动的networking连接:

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

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

最后,不要忘记将以下三个权限添加到您的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"/> 

将网页保存到caching中;

 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 

在线时检查此链接WebView加载网站,离线时加载本地文件