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ąć?
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:
- Włącz javascript
- Dodaj własną klasę interfejsu javascript , aby umożliwić javascript komunikować się z kodem Androida
- zarejestruj swój własny webviewClient , nadpisując onPageFinished aby wstawić trochę javascript
- 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>
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
}
});
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
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.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.
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