在 android 中对 Web 视图进行 javascript 注入并获取 HTML 到字符串
Make javascript injection to web view in android and get HTML to a string
我已经尝试了很长时间,想找到一种方法来从我在 android 应用程序中加载的 Web 视图中获取 HTML 内容。我发现一些指南指出我需要使用 javascript 界面,并且在某种程度上我已经做到了。现在的问题是我无法完成最后一步,我实际上得到了一个我可以操作的 HTML 的字符串。我需要一个字符串,在我从 Web 视图中检索到它后,我可以在其中使用 java 代码中的 html。到目前为止,这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//login button
Button loginButton = (Button) findViewById(R.id.loginButton);
final WebView webview = (WebView)(findViewById(R.id.webview));
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Call private method
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
/* This call inject JavaScript into the page which just finished loading. */
webview.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");
webview.setVisibility(View.INVISIBLE);
}
});
webview.setVisibility(View.VISIBLE);
MyJavaScriptInterface JSInterface = new MyJavaScriptInterface();
webview.getSettings().setJavaScriptEnabled(true);
webview.postUrl(url, SAMLreq.getBytes());
webview.addJavascriptInterface(JSInterface, "HTMLOUT");
//The html from the webview should be stored here
String htmlFromWebView = JSInterface.getTheHTMLToGo();
class MyJavaScriptInterface {
private String theHTMLToGo = null;
public String getTheHTMLToGo() {
return theHTMLToGo;
}
public void setTheHTMLToGo(String theHTMLToGo) {
this.theHTMLToGo = theHTMLToGo;
}
@SuppressWarnings("unused")
@JavascriptInterface
public void processHTML(String html) {
theHTMLToGo = html
}
}
}
我可以在调试时看到 java 脚本方法中的 'html' 字符串 'processHTML' 实际上包含正确的值,但我仍然不知道如何从那里把它弄出来。
解决方案一直就在我面前。正如我的 post 对这个问题的评论:我基本上是在做正确的事。我的问题是我调用方法 getTheHTMLToGo()
太早了。我将一些代码移到了 processHTML(String html)
中,并确保流程在我继续之前完成。我通过在 processHTML(String html)
方法中调用我需要做的下一件事来做到这一点。
我已经尝试了很长时间,想找到一种方法来从我在 android 应用程序中加载的 Web 视图中获取 HTML 内容。我发现一些指南指出我需要使用 javascript 界面,并且在某种程度上我已经做到了。现在的问题是我无法完成最后一步,我实际上得到了一个我可以操作的 HTML 的字符串。我需要一个字符串,在我从 Web 视图中检索到它后,我可以在其中使用 java 代码中的 html。到目前为止,这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//login button
Button loginButton = (Button) findViewById(R.id.loginButton);
final WebView webview = (WebView)(findViewById(R.id.webview));
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Call private method
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
/* This call inject JavaScript into the page which just finished loading. */
webview.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('body')[0].innerHTML+'</head>');");
webview.setVisibility(View.INVISIBLE);
}
});
webview.setVisibility(View.VISIBLE);
MyJavaScriptInterface JSInterface = new MyJavaScriptInterface();
webview.getSettings().setJavaScriptEnabled(true);
webview.postUrl(url, SAMLreq.getBytes());
webview.addJavascriptInterface(JSInterface, "HTMLOUT");
//The html from the webview should be stored here
String htmlFromWebView = JSInterface.getTheHTMLToGo();
class MyJavaScriptInterface {
private String theHTMLToGo = null;
public String getTheHTMLToGo() {
return theHTMLToGo;
}
public void setTheHTMLToGo(String theHTMLToGo) {
this.theHTMLToGo = theHTMLToGo;
}
@SuppressWarnings("unused")
@JavascriptInterface
public void processHTML(String html) {
theHTMLToGo = html
}
}
}
我可以在调试时看到 java 脚本方法中的 'html' 字符串 'processHTML' 实际上包含正确的值,但我仍然不知道如何从那里把它弄出来。
解决方案一直就在我面前。正如我的 post 对这个问题的评论:我基本上是在做正确的事。我的问题是我调用方法 getTheHTMLToGo()
太早了。我将一些代码移到了 processHTML(String html)
中,并确保流程在我继续之前完成。我通过在 processHTML(String html)
方法中调用我需要做的下一件事来做到这一点。