web-dev-qa-db-ja.com

android-Webviewからテキストを取得する

私のアプリケーションでは、_ [〜#〜] epublib [〜#〜] を使用してwebviewにepub HTMLファイルを表示しています。私の問題は、epubリーダーにブックマーク機能を使用したいことです。そのために、epubのHTMLファイルからページを表示しているwebviewからテキストをフェッチし、そのテキストをブックマークアクティビティで使用して、ユーザーがブックマークした内容をユーザーに表示します。どうすればこれを達成できますか?

22
Rohit

Webviewからプレーンテキストコンテンツを取得することはかなり困難です。基本的に、Androidクラスは提供しませんが、javascriptは提供します、およびAndroidは、JavaScriptがコードに情報を返す方法を提供します。

詳細に入る前に、html構造が単純な場合、データを手動で解析する方がよいことに注意してください。

そうは言っても、ここではあなたがすることです:

  1. JavaScriptを有効にする
  2. 独自のJavaScriptインターフェースクラスを追加 、JavaScriptがあなたのAndroidコードと通信できるようにします
  3. 独自の webviewClient を登録し、 onPageFinished をオーバーライドして少しのJavaScriptを挿入します
  4. JavaScriptで、タグの element.innerText を取得し、それをJavaScriptインターフェースに渡します。

明確にするために、以下の実用的な(ただし非常に大まかな)コード例を掲載します。上部にWebビューを表示し、下部にテキストベースのコンテンツを含むテキストビューを表示します。

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>
44
Paul-Jan
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
        }
});
9
Balaji M

この場合に頭に浮かぶのは、JavaScriptを使用することだけです。私が見つけたクイック検索を行う Android.webkit.WebView.addJavascriptInterface

最終的に問題を解決するのに役立つ「addJavascriptInterface」を調べたい

4
Th0rndike

上記のソリューションでは、webViewのすべてのテキストを返すinnerTextプロパティを使用してテキストを提供しています。以下に提案する解決策は、画面上の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つの文字列が必要になります。 1つはjavascriptメソッドをロードし、もう1つはそれを呼び出します。

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つのJavaScriptをロードする必要があります。

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


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

楽しい。

4

本からEPUBLIBでテキストを直接フェッチしませんか?

あなたはEPUBLIBの助けを借りてそのHTMLを手に入れましたよね?それをウェブビューにどのように入れましたか?例はありません。

0
Helper