Kann ich ein Javascript-Objekt an ein Android WebView übergeben?

8

Ich migriere eine Webanwendung in eine Android-Version. Nachdem ich JSON-Daten empfangen und verarbeitet habe, habe ich ein Array von Javascript-Objekten auf der Seite.

Wie kann ich den vollständigen Inhalt eines der JavaScript-Objekte "out" an den Webview-Container zur Anzeige mit nativen Android-Steuerelementen übergeben?

Schließlich könnte ich eine JavaScript-Schnittstelle mit einer Methode erstellen, die Parameter für jede der möglichen Javascript-Objekteigenschaften hat - aber das scheint übermäßig schwer zu sein.

Kann jemand dabei helfen?

    
Simon 02.04.2012, 15:41
quelle

1 Antwort

15

Android WebView enthält eine Methode namens addJavascriptInterface(Object obj, String interfaceName) , die hier nützlich sein sollte.

Mit dieser Methode kann auf das Objekt obj , das Sie als Schnittstelle hinzufügen, über JavaScript-Code in der Web-Ansicht zugegriffen werden. In Ihrem Fall könnten Sie ein Objekt mit einer Setter-Methode übergeben, die ein JavaScript-Objekt zurück an Java übergibt.

Sie müssen immer noch den Klebecode erstellen, der Ihr JavaScript-Objekt in das JSON-Objekt konvertiert. Für einen schnellen Ansatz können Sie Ihre Schnittstelle einfach ein JSONObject auf der Java-Seite generieren lassen, indem Sie eine JSON-Zeichenfolge verwenden, die von JavaScript übergeben wird. Die Klasse JSONObject in Java hat einen Konstruktor, der einen String akzeptiert, der JSON-Daten enthält. Sie können also das stringifizierte Ergebnis direkt an Java übergeben und das Objekt auf diese Weise erstellen. Zum Beispiel:

%Vor%

Dann auf der JavaScript-Seite im Handler, der in der Variablen jsonData einen Blob von nicht geparktem JSON hat:

%Vor%

Nun wird Ihr JSInterface auf der Java-Seite ein JSONObject enthalten, das die Elemente enthält, auf die Sie mit den von JSONObject bereitgestellten Gettern zugreifen können. Die über den JavaScript-Aufruf erstellten Objekte befinden sich in der mObjectsFromJS -Karte. Sie möchten der JSInterface-Klasse natürlich zusätzliche Hilfsmethoden hinzufügen, um die Objekte besser verwalten zu können.

Ich habe keine dieser Methoden kompiliert oder getestet, daher müssen Sie sie eventuell etwas für den ordnungsgemäßen Betrieb optimieren. Aber hoffentlich gibt dir das die Idee.

Wenn die Objekte jedoch über eine konsistente Schnittstelle und Datenelemente verfügen, wäre es sinnvoller, eine einfache JavaScript-Leimfunktion zu erstellen, die die JavaScript-Objekteigenschaften mithilfe von Setter-Methoden an die Java-seitigen Objektfelder bindet.

BITTE BEACHTEN Auf diese Weise kann Remotecode Code auf Ihrem Gerät auslösen. Wenn Sie nicht die vollständige Kontrolle über die Seiten / Skripte haben, die in WebView geladen werden, sollten Sie sicherstellen, dass das von obj bereitgestellte Verhalten keine Exploits zulässt.

    
Jason LeBrun 02.04.2012, 18:54
quelle

Tags und Links