Android - получить текст из webview - программирование
Подтвердить что ты не робот

Android - получить текст из webview

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

4b9b3361

Ответ 1

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

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

Итак, вот что вы делаете:

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

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>

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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