Ich möchte etwas von einer Webseite in Android ziehen. Ich weiß, dass es Bibliotheken gibt, um HTML zu analysieren, aber ich dachte, dass ich vielleicht ein bisschen schummeln könnte.
Hier ist was ich tue ..
Hier ist ein Code ...
%Vor%Da das WebView in der Benutzeroberfläche nicht sichtbar ist, ist es schwer zu sagen, welcher Teil bricht. Alles, was ich weiß, ist, dass das erste Log aufgerufen wird, aber das Log und Toast vom JavascriptInterface werden niemals angezeigt.
Ist das, was ich versuche, überhaupt möglich? Wenn ja, was mache ich falsch? Wenn nicht, warum nicht?
BEARBEITEN
Stuck die Ansicht in der Benutzeroberfläche zum Testen, anscheinend funktioniert der zweite Aufruf von loadUrl nicht. Egal welches Javascript ich versuche zu injizieren, es funktioniert nicht.
BEARBEITEN 2
Ich fühle mich dumm, wenn ich vergessen habe Javascript zu aktivieren, aber es funktioniert immer noch nicht .. Ich habe die folgenden Zeilen hinzugefügt.
%Vor%EDIT 3
Danke für alle Vorschläge, ihr wart hilfreich, aber bis jetzt funktioniert es immer noch nicht, es sei denn, jemand stellt in der nächsten Stunde Arbeitscode zur Verfügung, Nainal bekommt die Hälfte des Kopfgelds. Wenn dem so ist, bin ich mir nicht sicher, ob es mir erlaubt sein wird, ein weiteres Kopfgeld darauf zu legen, da das Problem immer noch ungelöst ist.
Hier ist mein bisheriger Code, nachdem ich Vorschläge auf dieser Seite berücksichtigt und einige Einstellungen aus dem Handbuch versucht habe, die ich nicht wirklich verstehe.
%Vor%Bearbeiten 4
Begann ein neues Kopfgeld und erhöhte die Belohnung auf 100 Punkte. Nainal bekam das letzte Kopfgeld dafür, dass es am hilfreichsten war, nicht um das Problem zu lösen.
Hier ist eine bereinigte Version, die unnötigen Code minimiert. Dies läuft auf API Level 18 und 23 Emulatoren (und meinem 6.0.1 Telefon). Das webView wird niemals zur Ansichtshierarchie hinzugefügt. Der Toast zeigt den HTML-Code, der sowieso von der Site gezogen wurde. Kompiliert mit API 25 mit Java 8.
%Vor%Hier ist das Layout.
%Vor%Und schließlich das Manifest.
%Vor%Ein paar Dinge, die mir bekannt werden.
Die JavaScript-Schnittstelle sollte VOR dem Laden von URLs angehängt werden.
Die zweite loadURL window.onload
wird möglicherweise zugewiesen, nachdem die ursprüngliche URL geladen wurde. Es wäre sinnvoller, setWebViewClient()
aufzurufen und Droid.showToast('testing!');
von der Methode onPageFinished
aus aufzurufen.
Das @JavascriptInterface
wird nicht auf dem Haupt-UI-Thread ausgeführt, wodurch die Ausführung Ihrer Toasts gestoppt wird.
Das Problem mit dem innerHTML
code Ihrer zweiten Änderung funktioniert nicht mit Punkt 2. Sie machen Ihre Aufrufe in einem synchronen einzelnen Block, während es NACH dem Laden der Seite dom AKA onPageFinished()
sein sollte.
webview.addJavascriptInterface(new jsInterface(), "Droid");
müssen vor webview.loadUrl("https://example.com");
Verwenden Sie dann den Webview Listener. onFinish () Methode .. dann injizieren Sie Ihre webview.loadUrl("javascript: window.onload=function(){ Droid.showToast('testing!'); }");
in onFinish Methode
Ich tue schon Tonnen von webview Injektion modifizieren Web .. ich denke, es sollte funktionieren ..
BEARBEITEN
Verwenden Sie chrome://inspect/#devices
, um Ihre App zu überprüfen, wenn webview geladen wird
Ich habe eine Beispielanwendung mit der neuesten Codeversion erstellt und dabei die folgenden Probleme festgestellt:
Die URL wurde nie für mich geladen. Um das zu beheben, habe ich hinzugefügt die Internet-Erlaubnis für AndroidManifest
Das WebView zeigt nie etwas an, weil es niemals aus dem Code an den Bildschirm angehängt wird. Versuchen Sie es mit diesem Beispielcode (dieser Code sollte funktionieren, wenn Sie die generierten Layout-Ressourcen der Android-Seed-App verwendet haben; andernfalls müssen Sie die Webansicht auf andere Weise an den Bildschirm anhängen - lassen Sie mich wissen, wenn dies der Fall ist):
%Vor%Bitte lassen Sie mich wissen, wenn es irgendwelche anderen Probleme mit Ihrem Experiment gibt
Tags und Links javascript java android webview javascript-injection