Welches ist die einfachste Methode, um HTML-Code aus einer Webansicht abzurufen? Ich habe verschiedene Methoden von Stackoverflow und Google ausprobiert, kann aber keine genaue Methode finden. Bitte geben Sie einen genauen Weg an.
public class htmldecoder extends Activity implements OnClickListener,TextWatcher
{
TextView txturl;
Button btgo;
WebView wvbrowser;
TextView txtcode;
ImageButton btcode;
LinearLayout llayout;
int flagbtcode;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.htmldecoder);
txturl=(TextView)findViewById(R.id.txturl);
btgo=(Button)findViewById(R.id.btgo);
btgo.setOnClickListener(this);
wvbrowser=(WebView)findViewById(R.id.wvbrowser);
wvbrowser.setWebViewClient(new HelloWebViewClient());
wvbrowser.getSettings().setJavaScriptEnabled(true);
wvbrowser.getSettings().setPluginsEnabled(true);
wvbrowser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wvbrowser.addJavascriptInterface(new MyJavaScriptInterface(),"HTMLOUT");
//wvbrowser.loadUrl("http://www.google.com");
wvbrowser.loadUrl("javascript:window.HTMLOUT.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
txtcode=(TextView)findViewById(R.id.txtcode);
txtcode.addTextChangedListener(this);
btcode=(ImageButton)findViewById(R.id.btcode);
btcode.setOnClickListener(this);
}
public void onClick(View v)
{
if(btgo==v)
{
String url=txturl.getText().toString();
if(!txturl.getText().toString().contains("http://"))
{
url="http://"+url;
}
wvbrowser.loadUrl(url);
//wvbrowser.loadData("<html><head></head><body><div style='width:100px;height:100px;border:1px red solid;'></div></body></html>","text/html","utf-8");
}
else if(btcode==v)
{
ViewGroup.LayoutParams params1=wvbrowser.getLayoutParams();
ViewGroup.LayoutParams params2=txtcode.getLayoutParams();
if(flagbtcode==1)
{
params1.height=200;
params2.height=220;
flagbtcode=0;
//txtcode.setText(wvbrowser.getContentDescription());
}
else
{
params1.height=420;
params2.height=0;
flagbtcode=1;
}
wvbrowser.setLayoutParams(params1);
txtcode.setLayoutParams(params2);
}
}
public class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
/*@Override
public void onPageFinished(WebView view, String url)
{
// This call inject JavaScript into the page which just finished loading.
wvbrowser.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}*/
}
class MyJavaScriptInterface
{
@SuppressWarnings("unused")
public void showHTML(String html)
{
txtcode.setText(html);
}
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
wvbrowser.loadData("<html><div"+txtcode.getText().toString()+"></div></html>","text/html","utf-8");
}
}
android
android-widget
webview
Hope4You
quelle
quelle
webview.loadUrl("javascript:window.HtmlViewer.showHTML" + "('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
das Programm wie die Funktion finish () und beendet diese Aktivität. Warum? Wie kann man sie lösen?Uncaught ReferenceError: HtmlViewer is not defined
, egal mit oder ohne@JavascriptInterface
In KitKat und höher können Sie die
evaluateJavascript
Methode für die Webansicht verwendenWeitere Beispiele finden Sie in dieser Antwort
quelle
Vergessen Sie für Android 4.2 nicht, allen JavaScript-Funktionen @JavascriptInterface hinzuzufügen
quelle
Android WebView ist nur eine weitere Render-Engine, die HTML-Inhalte rendert, die von einem HTTP-Server heruntergeladen wurden, ähnlich wie Chrome oder FireFox. Ich weiß nicht, warum Sie die gerenderte Seite (oder den Screenshot) von WebView erhalten müssen. In den meisten Fällen ist dies nicht erforderlich. Sie können den HTML-Rohinhalt jederzeit direkt vom HTTP-Server abrufen.
Es gibt bereits Antworten zum Abrufen des Rohdatenstroms mithilfe von HttpUrlConnection oder HttpClient. Alternativ gibt es eine sehr praktische Bibliothek für das Parsen / Verarbeiten von HTML-Inhalten unter Android: JSoup . Sie bietet eine sehr einfache API zum Abrufen von HTML-Inhalten vom HTTP-Server und eine abstrakte Darstellung von HTML-Dokumenten, um nicht nur das Parsen von HTML zu verwalten in einem OO-Stil, aber auch sehr leicht:
Dies ist praktisch, wenn Sie beispielsweise zuerst ein HTML-Dokument herunterladen und dann ein benutzerdefiniertes CSS oder Javascript hinzufügen möchten, bevor Sie es zum Rendern an WebView übergeben. Viel mehr auf ihrer offiziellen Website, es lohnt sich, es sich anzusehen.
quelle
Ein Berührungspunkt, den ich gefunden habe und der eingerichtet werden muss, ist in der Proguard-Konfiguration "versteckt". Während der HTML-Reader beim Debuggen der App problemlos über die Javascript-Oberfläche aufgerufen wird, funktioniert dies nicht mehr, sobald die App über Proguard ausgeführt wurde, es sei denn, die HTML-Reader-Funktion ist in der Proguard-Konfigurationsdatei wie folgt deklariert:
Getestet und bestätigt auf Android 2.3.6, 4.1.1 und 4.2.1.
quelle
Android lässt Sie dies aus Sicherheitsgründen nicht tun. Ein böser Entwickler könnte sehr leicht vom Benutzer eingegebene Anmeldeinformationen stehlen.
Stattdessen müssen Sie den in der Webansicht angezeigten Text abfangen, bevor er angezeigt wird. Wenn Sie keinen Antwort-Handler einrichten möchten (wie in den anderen Antworten angegeben), habe ich diesen Fix mit einigem googeln gefunden:
Dies ist eine Menge Code, und Sie sollten in der Lage sein, ihn zu kopieren / zu kopieren, und am Ende
str
wird er denselben HTML-Code enthalten, der in der Webansicht gezeichnet wurde. Diese Antwort ist auf einfachste Weise, um HTML von der Webseite korrekt in eine Zeichenfolge in Java zu laden, und sollte auch unter Android funktionieren. Ich habe dies nicht getestet und nicht selbst geschrieben, aber es könnte Ihnen helfen.Außerdem ist die URL, die hier abgerufen wird, fest codiert, sodass Sie dies ändern müssen.
quelle
Warum nicht zuerst das HTML herunterladen und dann an die Webansicht übergeben?
Dies sollte ungefähr das tun, was Sie tun möchten. Es ist angepasst von Ist es möglich, den HTML-Code von WebView abzurufen und für seine Antwort an https://stackoverflow.com/users/325081/aymon-fournier zu senden .
quelle
Ich würde vorschlagen, anstatt zu versuchen, den HTML-Code aus der WebView zu extrahieren, den HTML-Code aus der URL zu extrahieren. Damit meine ich die Verwendung einer Drittanbieter-Bibliothek wie JSoup, um den HTML-Code für Sie zu durchlaufen. Der folgende Code ruft den HTML-Code von einer bestimmten URL für Sie ab
quelle
Es ist einfach zu implementieren. Sie benötigen lediglich Javasript-Methoden in Ihrem HTML-Code, um den Wert des HTML-Inhalts zu ermitteln. Wie über Ihrem Code müssen einige Änderungen vorgenommen werden.
Ihr Javascript in HTML
& Stellen Sie sicher, dass Sie callme wie unten in HTML aufrufen
<input name="FacadeAL" id="FacadeAL" type="text" size="5" onblur="callme()"/>
Hoffe das wird dir helfen.
quelle
& Make sure you calling callme like below in html
? Wollten Sie das Eingabe-Tag in der HTML-Datei unter dem Skript platzieren?Thank You
Thank you very much
Ich schlage vor, einen Reflection-Ansatz auszuprobieren, wenn Sie Zeit für den Debugger haben (sorry, aber ich hatte keine).
Ausgehend von der
loadUrl()
Methode derandroid.webkit.WebView
Klasse:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/webkit/WebView.java#WebView.loadUrl%28java.lang.String % 2Cjava.util.Map% 29
Sie sollten auf dem
android.webkit.BrowserFrame
landen, der dienativeLoadUrl()
native Methode aufruft:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/webkit/BrowserFrame.java#BrowserFrame.nativeLoadUrl%28java.lang.String % 2Cjava.util.Map% 29
Die Implementierung der nativen Methode sollte hier sein:
http://gitorious.org/0xdroid/external_webkit/blobs/a538f34148bb04aa6ccfbb89dfd5fd784a4208b1/WebKit/android/jni/WebCoreFrameBridge.cpp
Wünsche dir viel Glück!
quelle
Versuchen Sie, HttpClient zu verwenden, wie Sephy sagte:
quelle
THANKS
Die oben angegebenen Methoden sind für, wenn Sie eine Web-URL haben, aber wenn Sie eine lokale HTML haben, können Sie auch HTML durch diesen Code haben
quelle