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

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

Solutions Collecting From Web of "Android – получить текст из webview"

Получение простого текстового контента из веб-представления довольно сложно. В принципе, классы 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> 

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

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

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

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

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

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

Наслаждаться.