android – 从webview中获取文本
在我的应用程序中,我使用EPUBLIB在webview
显示epub HTML文件。 我的问题是,我想为我的epub阅读器使用书签function。 为此,我想从webview
中获取文本,该文本显示来自我的epub的HTML文件的页面,然后在我的书签活动中使用该文本来向用户显示他们已经添加了书签的内容。 我怎样才能做到这一点?
从webview获取纯文本内容是相当困难的。 基本上,android类不提供它,但JavaScript的 ,Android提供了一种方法为JavaScript传递信息回你的代码。
在深入细节之前,请注意,如果你的html结构很简单, 那么你最好手动parsing数据 。
这就是说,这是你所做的:
- 启用JavaScript
- 添加您自己的JavaScript接口类 ,以允许JavaScript与您的Android代码进行通信
- 注册您自己的webviewClient ,覆盖onPageFinished插入一点的JavaScript
- 在JavaScript中,获取标签的element.innerText ,并将其传递到您的JavaScript界面。
为了澄清,我将在下面发布一个工作(但非常粗糙)的代码示例。 它在顶部显示webview,在底部显示基于文本内容的文本视图。
package test.android.webview; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView; public class WebviewTest2Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView webView = (WebView) findViewById(R.id.webView); TextView contentView = (TextView) findViewById(R.id.contentView); /* An instance of this class will be registered as a JavaScript interface */ class MyJavaScriptInterface { private TextView contentView; public MyJavaScriptInterface(TextView aContentView) { contentView = aContentView; } @SuppressWarnings("unused") public void processContent(String aContent) { final String content = aContent; contentView.post(new Runnable() { public void run() { contentView.setText(content); } }); } } webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE"); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);"); } }); webView.loadUrl("http://shinyhammer.blogspot.com"); } }
使用以下main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="0.5" /> <TextView android:id="@+id/contentView" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="0.5" /> </LinearLayout>
在这种情况下唯一让我想到的是使用JavaScript。 做一个快速search,我发现android.webkit.WebView.addJavascriptInterface
。
你想学习最后的“addJavascriptInterface”将帮助你解决问题
wvbrowser.evaluateJavascript( "(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();", new ValueCallback<String>() { @Override public void onReceiveValue(String html) { Log.d("HTML", html); // code here } });
你为什么不直接从书中拿EPUBLIB的文本?
你在EPUBLIB的帮助下得到了这个html不是吗? 你是怎么把它放在webvieuw的? 我没有看到任何例子。
上面提供的解决scheme提供了使用innerText属性的文本,它将返回您在webView中的所有文本。 下面我提出的解决scheme将帮助您从WebView的可见部分提取文本在屏幕上。
第一步:它需要javaScript的帮助,因此首先启用JavaScript。
webView.addJavascriptInterface(new IJavascriptHandler(getActivity().getApplicationContext()), "Android"); //if your class extends a Fragment class
要么
view.addJavascriptInterface(new IJavascriptHandler(this), "Android"); //if your class extends Activity.
第2步:创build一个javaInterface内部类。
final class IJavascriptHandler { Context mContext; IJavascriptHandler(Context c) { mContext = c; } //API 17 and higher required you to add @JavascriptInterface as mandatory before your method. @JavascriptInterface public void processContent(String aContent) { //this method will be called from within the javascript method that you will write. final String content = aContent; Log.e("The content of the current page is ",content); } }
第3步:现在你必须添加javascript方法。 你将把这个方法写成一个string,然后加载它。 该方法基于提供给它的参数返回文本。 所以,你需要2个string。 一个会加载JavaScript方法,另一个会调用它。
加载javascript方法的方法。
String javaScriptToExtractText = "function getAllTextInColumn(left,top,width,height){" + "if(document.caretRangeFromPoint){" + "var caretRangeStart = document.caretRangeFromPoint(left, top);" + "var caretRangeEnd = document.caretRangeFromPoint(left+width-1, top+height-1);" + "} else {" + "return null;" + "}" + "if(caretRangeStart == null || caretRangeEnd == null) return null;" + "var range = document.createRange();" + "range.setStart(caretRangeStart.startContainer, caretRangeStart.startOffset);" + "range.setEnd(caretRangeEnd.endContainer, caretRangeEnd.endOffset);" + "return range.toString();};";
方法来调用上面的函数。
String javaScriptFunctionCall = "getAllTextInColumn(0,0,100,100)"; //I've provided the parameter here as 0,0 ie the left and top offset and then 100, 100 as width and height. So, it'll extract the text present in that area.
第4步:现在,您需要加载上述2个JavaScript。
webView.loadURL("javascript:"+ javaScriptToExtractText); //this will load the method. view.loadUrl("javascript:window.Android.processContent("+javaScriptFunctionCall+");"); //this will call the loaded javascript method.
请享用。