android-get Text out of webview

W mojej aplikacji wyświetlam pliki HTML epub w webview używając EPUBLIB. Mój problem polega na tym, że chcę korzystać z funkcji zakładek dla mojego czytnika epub. W tym celu Chcę pobrać tekst z webview, który pokazuje stronę z pliku HTML mojego epub, a następnie użyć tego tekstu w mojej aktywności zakładek, aby pokazać użytkownikowi, co ma zakładkę. Jak mogę to osiągnąć?

Author: Rohit, 2012-03-06

5 answers

Uzyskanie zwykłej zawartości tekstowej z widoku sieci Web jest raczej trudne. Zasadniczo, klasy Androida nie oferują tego, ale javascript robi , A Android oferuje sposób javascript, aby przekazać informacje z powrotem do kodu.

Zanim przejdę do szczegółów, zwróć uwagę, że jeśli twoja struktura html jest prosta, może być lepiej po prostu parsowanie danych ręcznie .

To powiedziane, oto co robisz:

  1. Włącz javascript
  2. Dodaj własną klasę interfejsu javascript , aby umożliwić javascript komunikować się z kodem Androida
  3. zarejestruj swój własny webviewClient , nadpisując onPageFinished aby wstawić trochę javascript
  4. w javascript uzyskaj element .innerText znacznika i przekaż go do interfejsu javascript.

Aby wyjaśnić, zamieszczę poniżej działający (ale bardzo szorstki) przykład kodu. Informatyka wyświetla widok sieci Web na górze i widok tekstu z zawartością tekstową na dole.

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

Używając następującego 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>
 36
Author: Paul-Jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 09:59:21
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
        }
});
 5
Author: Balaji M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 09:40:14

Jedyne, co przychodzi mi do głowy w tym przypadku, to użycie javascript. Robiąc szybkie wyszukiwanie znalazłem android.webkit.WebView.addJavascriptInterface.

Chcesz przestudiować "addJavascriptInterface", który w końcu pomoże Ci rozwiązać problem

 4
Author: Th0rndike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-12 17:59:33

Rozwiązanie podane powyżej dostarcza tekst za pomocą właściwości innerText, która zwróci cały tekst w widoku sieci Web. Rozwiązanie, które proponuję poniżej pomoże Ci wyodrębnić tekst z widocznej części webView na ekranie.

Krok 1: wymaga pomocy javaScript, dlatego najpierw włącz javascript.

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

Lub

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

Krok 2: Utwórz wewnętrzną klasę 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);
} 
}

Krok 3: Teraz musisz dodać metodę javascript. Napiszesz metoda jako ciąg znaków, a następnie załadować go. Metoda zwraca tekst na podstawie podanego parametru. Więc potrzebujesz dwóch strun. Jeden załaduje metodę javascript, a drugi ją wywoła.

Metoda do wczytania metody 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();};";

Metoda wywołania powyższej funkcji.

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.

Krok 4: Teraz musisz załadować powyższe 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.
Smacznego.
 2
Author: Arunavh Krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 10:26:41

Dlaczego nie pobrać tekst z EPUBLIB bezpośrednio z książki?

Masz ten html z pomocą EPUBLIB? Jak to umieściłeś w webvieuw? Nie widzę żadnego przykładu.

 0
Author: Helper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 09:34:34