如何在 android 应用程序中以在线和离线模式加载或检索网页?

how to load or retrieve a webpage in both online and offline mode in android application?

我需要在 android 设备的内部或外部存储器中加载和检索 HTML 网页。我需要的是使用网络视图在 android 中下载和检索网页。

有很多类似下载或保存网页的重复问题。但是 none 的答案对我有帮助。指导我!

提前致谢。

WebView 可以加载和呈现 remotelocal html 页面,此外它还支持 'data' scheme URL

Storage Options

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

Store private primitive data in key-value pairs.

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

Store private data on the device memory.

外部存储(您可以在您的情况下使用但不推荐)

Store public data on the shared external storage.

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

Store structured data in a private database.

网络连接(你可以在你的情况下使用,但不能离线工作模式)

Store data on the web with your own network server.

您可能想尝试使用 WebViewClientshouldInterceptRequest 方法,该方法使用设置为您的 WebView。它可以让您知道在 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);

Get the HTML code from loaded WebView

以上两个link就可以达到你的要求了, 您可以将 html 内容存储到文件中,然后存储到内部存储器中,然后您可以在离线模式下加载。

将网页保存到缓存中;

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

勾选这个linkWebView load website when online, load local file when offline

我不知道这个解决方案是否适合your.if您想离线查看网站mod和在线mod您可以使用网络爬虫来获取所有数据来自网站。Here 是 android web crawler.after 的示例项目,您可以根据您的互联网可用性从 url 或本地内存加载网站。

对我来说,这听起来像是一个简单的 webview 缓存机制。

试试这个

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

方法 isNetworkAvailable() 检查活动的网络连接:

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"/>