Android - получить текст из веб-просмотра - PullRequest
21 голосов
/ 06 марта 2012

В моем приложении я показываю файлы epub HTML в webview, используя EPUBLIB . Моя проблема в том, что я хочу использовать функцию закладок для моего epub reader. Для этого я хочу получить текст из webview, который показывает страницу из HTML-файла моего epub, а затем использовать этот текст в моей активности по закладкам, чтобы показать пользователю, что он добавил в закладки. Как мне этого добиться?

Ответы [ 5 ]

40 голосов
/ 06 марта 2012

Получение простого текстового контента из веб-просмотра довольно сложно. По сути, классы Android не предлагают его, но javascript делает , а Android предлагает javascript способ передать информацию обратно в ваш код.

Прежде чем углубляться в детали, обратите внимание, что если ваша html-структура проста, вам, возможно, будет лучше просто проанализировать данные вручную .

Тем не менее, вот что вы делаете:

  1. Включить JavaScript
  2. Добавьте свой собственный класс интерфейса JavaScript , чтобы позволить JavaScript общаться с вашим кодом Android
  3. Зарегистрируйте свой собственный webviewClient , переопределяя onPageFinished , чтобы вставить немного JavaScript
  4. В javascript получите element.innerText тега и передайте его в свой интерфейс javascript.

Чтобы уточнить, я опубликую пример рабочего (но очень грубого) кода ниже. Он отображает веб-вид сверху и текстовое представление с текстовым содержимым внизу.

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>
7 голосов
/ 17 февраля 2017
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
        }
});
4 голосов
/ 06 марта 2012

Единственное, что мне приходит в голову в этом случае, это использовать javascript.Выполняя быстрый поиск, я нашел android.webkit.WebView.addJavascriptInterface.

Вы хотите изучить «addJavascriptInterface», который в конце поможет вам решить проблему

3 голосов
/ 20 августа 2014

Решение, предоставленное выше, предоставляет текст с использованием свойства 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 строки.Один из них загрузит метод 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 вышеуказанных javascript-кода.

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


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

Наслаждайтесь.

0 голосов
/ 06 марта 2012

Почему бы вам не извлечь текст с EPUBLIB из книги напрямую?

Вы получили этот HTML с помощью EPUBLIB, не так ли?Как вы поместили это в webvieuw?Я не вижу примера.

...