android - 从webview中获取文本

时间:2012-03-06 07:50:55

标签: android webview epub

在我的应用程序中,我使用EPUBLIBwebview中显示epub HTML文件。 我的问题是我想为我的epub阅读器使用书签功能。为此,我想从webview获取文本,该文本显示我的epub的HTML文件中的页面,然后在我的书签活动中使用该文本向用户显示他们已添加书签的内容。 我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:39)

从webview获取纯文本内容相当困难。基本上,android类不提供它,但是 javascript ,Android提供了一种将javascript传递回代码的方法。

在进入细节之前,请注意,如果您的html结构很简单,您可能最好只手动解析数据

那说,这就是你做的事情:

  1. Enable javascript
  2. Add your own javascript interface class,允许javascript与您的Android代码进行通信
  3. 注册您自己的webviewClient,覆盖onPageFinished以插入一些javascript
  4. 在javascript中,获取代码的element.innerText,并将其传递给您的javascript界面​​。
  5. 为了澄清,我将在下面发布一个有效(但非常粗糙)的代码示例。它在顶部显示webview,在底部显示带有基于文本的内容的textview。

    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>
    

答案 1 :(得分:6)

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
        }
});

答案 2 :(得分:4)

在这种情况下我唯一想到的是使用javascript。快速搜索我找到android.webkit.WebView.addJavascriptInterface

你想学习“addJavascriptInterface”,它最终会帮你解决问题

答案 3 :(得分:2)

上面提供的解决方案使用innerText属性提供文本,该属性将返回webView中的所有文本。我在下面提出的解决方案将帮助您从屏幕上的webView的可见部分提取文本。

第1步:它需要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:创建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方法。您将该方法编写为字符串,然后加载它。该方法根据提供给它的参数返回文本。所以,你需要2个字符串。一个将加载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 i.e 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个javascripts。

webView.loadURL("javascript:"+ javaScriptToExtractText);
//this will load the method.


view.loadUrl("javascript:window.Android.processContent("+javaScriptFunctionCall+");");
//this will call the loaded javascript method.

享受。

答案 4 :(得分:0)

为什么不直接从书中用EPUBLIB获取文本?

你在EPUBLIB的帮助下得到那个html不是吗?你是怎么把它放在webvieuw的?我没有看到任何例子。