Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android应用程序中以在线和离线模式加载或检索网页?_Android_Html_Webview_Offline Caching_Android External Storage - Fatal编程技术网

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

如何在android应用程序中以在线和离线模式加载或检索网页?,android,html,webview,offline-caching,android-external-storage,Android,Html,Webview,Offline Caching,Android External Storage,我需要在android设备的内部或外部内存中加载和检索HTML网页。我需要的是使用web view在android中下载和检索网页 有很多重复的问题类似于下载或保存网页。但是没有一个答案对我有帮助。指引我 提前谢谢 AWebView可以加载和呈现remote和localhtml页面,还支持'data'方案URL 共享首选项(在您的情况下不有用) 在键值对中存储私有基元数据 内部存储(建议您使用) 在设备内存中存储私有数据 外部存储(您可以在您的情况下使用,但不推荐使用) 将公共数据存储在共享的

我需要在android设备的内部或外部内存中加载和检索HTML网页。我需要的是使用web view在android中下载和检索网页

有很多重复的问题类似于下载或保存网页。但是没有一个答案对我有帮助。指引我


提前谢谢

A
WebView
可以加载和呈现
remote
local
html页面,还支持
'data'方案URL

共享首选项(在您的情况下不有用)

在键值对中存储私有基元数据

内部存储(建议您使用)

在设备内存中存储私有数据

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

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

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

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

网络连接(您可以在您的情况下使用,但不能在脱机模式下工作)

使用您自己的网络服务器在web上存储数据


您可能希望尝试使用
WebViewClient
shouldInterceptRequest
方法,该方法使用设置为
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);

通过以上两个环节,您可以达到您的要求,
您可以将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

检查此链接

我不知道此解决方案是否适合您。如果您想在脱机模式和联机模式下查看网站,您可以使用网络爬虫从网站获取所有数据。是android web crawler的一个示例项目。之后,您可以根据您的internet可用性从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(“”)

最后,别忘了向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"/>

您是否已尝试将此设置查看器.getSettings().setCacheMode(WebSettings.LOAD\u默认值)设置为webview?