studio programacion herramientas fundamentos con avanzado aplicaciones android webview epub

programacion - manual de android en pdf



Android-obtener texto de webview (5)

En mi aplicación, estoy mostrando archivos HTML epub en webview usando EPUBLIB . Mi problema es que quiero usar la funcionalidad de marcadores para mi lector de epub. Para eso quiero obtener texto de webview que muestra la página del archivo HTML de mi epub y luego usar ese texto en mi actividad de marcador para mostrar al usuario lo que ha marcado. ¿Cómo puedo conseguir esto?


¿Por qué no traes el texto con EPUBLIB del libro directamente?

Tienes ese html con la ayuda de EPUBLIB, ¿verdad? ¿Cómo pusiste eso en la webvieuw? No veo ningún ejemplo.


La solución proporcionada anteriormente proporciona el texto usando la propiedad innerText que le devolverá todo el texto en la vista web. La solución que propongo a continuación le ayudará a extraer el texto de la parte visible de webView en la pantalla.

Paso 1: Requiere la ayuda de javaScript, por lo tanto, primero habilite el javascript.

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

o

view.addJavascriptInterface(new IJavascriptHandler(this), "Android"); //if your class extends Activity.

Paso 2: Crea una clase interna 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); } }

Paso 3: Ahora tienes que agregar el método javascript. Escribirá el método como una cadena y luego lo cargará. El método devuelve el texto basado en el parámetro proporcionado. Entonces, necesitarías 2 cuerdas. Uno cargará el método javascript y el otro lo llamará.

Método para cargar el método 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();};";

Método para llamar a la función anterior.

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.

Paso 4: Ahora, necesitas cargar los 2 javascripts anteriores.

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

Disfrutar.


Lo único que me viene a la mente en este caso es usar javascript. Haciendo una búsqueda rápida encontré android.webkit.WebView.addJavascriptInterface .

Quieres estudiar el "addJavascriptInterface" que al final te ayudará a resolver el problema


Obtener el contenido de texto sin formato de una vista web es bastante difícil. Básicamente, las clases de Android no lo ofrecen, pero javascript lo hace , y Android ofrece una forma de javascript para pasar la información a su código.

Antes de entrar en los detalles, tenga en cuenta que si su estructura html es simple, es mejor que analice los datos manualmente .

Dicho esto, esto es lo que haces:

  1. Habilitar Javascript
  2. Agregue su propia clase de interfaz de javascript para permitir que javascript se comunique con su código de Android
  3. Registre su propio webviewClient , anulando onPageFinished para insertar un poco de javascript
  4. En el javascript, adquiera el elemento element.innerText de la etiqueta y páselo a su interfaz javascript.

Para aclarar, publicaré un ejemplo de código de trabajo (pero muy aproximado) a continuación. Muestra una vista web en la parte superior y una vista de texto con los contenidos basados ​​en texto en la parte inferior.

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

Usando el siguiente 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>


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