Javascript-Brücke in WebView einfügen

8

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 ..

  1. Erstellen Sie programmgesteuert ein WebView mit dem Anwendungskontext, damit es nicht auf der Benutzeroberfläche angezeigt werden muss.
  2. Laden Sie die Webseite
  3. Fügen Sie die JS-Schnittstelle
  4. hinzu
  5. Injizieren Sie etwas Javascript, um mit der Host-Anwendung zu interagieren

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.

    
Occam's Razor 05.08.2016, 19:13
quelle

6 Antworten

1

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%     
Hod 29.12.2016, 21:47
quelle
4

Bitte versuchen Sie es, es ruft die JavaScript-Funktion auf und zeigt auch eine Toast-Nachricht an.

%Vor%

WebView wird in der Benutzeroberfläche nicht angezeigt, da die Webansicht nicht im XML-Layout definiert ist.

    
Nainal 22.12.2016 08:53
quelle
2

Ein paar Dinge, die mir bekannt werden.

  1. Die JavaScript-Schnittstelle sollte VOR dem Laden von URLs angehängt werden.

  2. 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.

  3. Das @JavascriptInterface wird nicht auf dem Haupt-UI-Thread ausgeführt, wodurch die Ausführung Ihrer Toasts gestoppt wird.

  4. 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.

Passer by 25.12.2016 20:03
quelle
2

webview.addJavascriptInterface(new jsInterface(), "Droid"); müssen vor webview.loadUrl("https://example.com");

stehen

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

    
ZeroOne 27.12.2016 07:37
quelle
0

Wie wäre es mit onProgressChanged() in WebChromeClient ?

?

Ich habe etwas Code von Edit 3 geändert, um das zu mögen,

%Vor%

Die Änderung besteht darin, dass Sie Javascript bei progress==100 anstelle von onPageFinished()

aufrufen     
Choim 02.01.2017 09:20
quelle
0

Ich habe eine Beispielanwendung mit der neuesten Codeversion erstellt und dabei die folgenden Probleme festgestellt:

  1. Die URL wurde nie für mich geladen. Um das zu beheben, habe ich hinzugefügt die Internet-Erlaubnis für AndroidManifest  

  2. 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

    
Andrei Marcut 03.01.2017 14:02
quelle