我需要保存我在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上获取数据而不将它们传递给后端服务?
答案 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());
}
});