从WebView保存数据

时间:2016-05-05 08:02:57

标签: android webview

我需要保存我在WebView上显示的数据。 我已经通过保存在WebViewClient中创建的所有URL请求并将它们发送到后端服务来实现这一点。后端服务稍后会请求这些文件。

问题是WebViewClient正在运行自己的循环并且响应不可见,这导致我对每个资源发出两个请求。

有没有办法直接在WebViewClient中获取数据?

这是当前正在运行的代码:

private class Client extends WebViewClient{
@Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        plainText = //get plain text and save it
        webView.loadDataWithBaseURL(url, plainText, MIME_TYPE_TEXT_HTML, UTF_8_ENCODING, null);
        return true;
    }
    @SuppressWarnings("deprecation")
    @Override
    public synchronized WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        // we need to make sure it does nothing in this one for >= lollipop as in lollipop the call goes through both methods
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            return interceptRequest(view, url, null);
        }
        return null;
    }
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        WebResourceResponse response = super.shouldInterceptRequest(view, request);
        final String url = request.getUrl().toString();
        return interceptRequest(view, url, response);
    }

    private WebResourceResponse interceptRequest(WebView webView, String url, WebResourceResponse webResourceResponse) {
        addUrlToDownloadQueue(url);
        return webResourceResponse;
    }

addUrlToDownloadQueue(url); 注意将所有网址传递给检索所有来源的服务。

有没有办法在WebViewClient上获取数据而不将它们传递给后端服务?

4 个答案:

答案 0 :(得分:1)

您是否阅读过此前的question?

如果您无法实现目标,请告诉我。

答案 1 :(得分:1)

我发布了另一个答案,因为这个答案太长了,不适合发表评论。

嗯,如果您不控制网页,那么关注该问题并不好。实际上正如android开发人员指南中所述:“警告:使用addJavascriptInterface()允许JavaScript控制你的Android应用程序。这可能是一个非常有用的功能或危险的安全问题。当WebView中的HTML不值得信任时(例如,部分)或者所有HTML都是由未知的人或进程提供的,然后攻击者可以包含执行客户端代码的HTML,也可能包括攻击者选择的任何代码。“

要在网页中获取数据,您可以使用 webView.loadUrl(“javascript:document.getElementById(”example“)。value;”);

要从网页获取数据,请尝试参考此page.

如果您需要更多帮助,请与我联系!!

答案 2 :(得分:1)

你可以试试这个,也许这可以帮到你。

public class TestActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);
    final WebView webview = (WebView) findViewById(R.id.browser);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer");

    webview.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            webview.loadUrl("javascript:window.HtmlViewer.showHTML" +
                    "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
        }
    });

    webview.loadUrl("http://android-in-action.com/index.php?post/" +
            "Common-errors-and-bugs-and-how-to-solve-avoid-them");
}

class MyJavaScriptInterface {

    private Context ctx;

    MyJavaScriptInterface(Context ctx) {
        this.ctx = ctx;
    }

    public void showHTML(String html) {
        new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html)
                .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
    }

}
}

答案 3 :(得分:1)

请参阅我的示例以在提交之前获取数据:
https://github.com/henrychuangtw/WebView-Javascript-Inject

并停止将数据传递给后端,在onsubmit函数中返回false

webview1.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        StringBuilder sb = new StringBuilder();
        sb.append("document.getElementsByTagName('form')[0].onsubmit = function () {");
        sb.append("var objPWD, objAccount;var str = '';");
        sb.append("var inputs = document.getElementsByTagName('input');");
        sb.append("for (var i = 0; i < inputs.length; i++) {");
        sb.append("if (inputs[i].type.toLowerCase() === 'password') {objPWD = inputs[i];}");
        sb.append("else if (inputs[i].name.toLowerCase() === 'email') {objAccount = inputs[i];}");
        sb.append("}");
        sb.append("if (objAccount != null) {str += objAccount.value;}");
        sb.append("if (objPWD != null) { str += ' , ' + objPWD.value;}");
        sb.append("window.MYOBJECT.processHTML(str);");
        sb.append("return true;"); //return false, to stop onsubmit function
        sb.append("};");

        view.loadUrl("javascript:" + sb.toString());
    }
});