android - 从webview中获取文本

Roh*_*hit 22 android webview epub

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

Pau*_*Jan 43

从webview获取纯文本内容相当困难.基本上,Android类不提供它,但javascript确实如此,Android为javascript提供了一种将信息传递回代码的方法.

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

也就是说,这就是你做的:

  1. 启用javascript
  2. 添加您自己的javascript接口类,以允许javascript与您的Android代码进行通信
  3. 注册您自己的webviewClient,覆盖onPageFinished以插入一些javascript
  4. 在javascript中,获取标记的element.innerText,并将其传递给您的javascript界面​​.

为了澄清,我将在下面发布一个工作(但非常粗略)的代码示例.它在顶部显示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");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下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>
Run Code Online (Sandbox Code Playgroud)

  • 为了其他人的利益:Paul-Jan 的答案中指定的方法 processContent(...) 仅当为该方法指定了 @JavascriptInterface 注释且您的目标 sdk 版本&gt;=17(根据 https://developer)时才有效。 android.com/guide/webapps/webview.html#BindingJavaScript (2认同)

Bal*_*i M 7

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
        }
});
Run Code Online (Sandbox Code Playgroud)


小智 5

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

步骤1:需要javaScript的帮助,因此首先启用javascript。

webView.addJavascriptInterface(new IJavascriptHandler(getActivity().getApplicationContext()),     "Android"); //if your class extends a Fragment class
Run Code Online (Sandbox Code Playgroud)

或者

view.addJavascriptInterface(new IJavascriptHandler(this), "Android"); //if your class extends Activity.
Run Code Online (Sandbox Code Playgroud)

第 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);
} 
}
Run Code Online (Sandbox Code Playgroud)

第 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();};";
Run Code Online (Sandbox Code Playgroud)

调用上述函数的方法。

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.
Run Code Online (Sandbox Code Playgroud)

第 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.
Run Code Online (Sandbox Code Playgroud)

享受。