Come chiamiamo javascript da Android? Ho questa libreria javascript che vorrei usare, voglio chiamare la funzione javascript e passare il valore del risultato al codice java android. Non ho trovato la risposta da ora. Sono riuscito a chiamare il codice di Android da javascript, ma voglio il contrario.Come chiamare javascript da Android?
risposta
C'è un hack:
Bind qualche oggetto Java in modo che possa essere chiamato da JavaScript con WebView:
addJavascriptInterface(javaObjectCallback, "JavaCallback")
Forza eseguire JavaScript all'interno di una pagina esistente da
WebView.loadUrl("javascript: var result = window.YourJSLibrary.callSomeFunction(); window.JavaCallback.returnResult(result)");
(in questo caso la classe java JavaObjectCallback
dovrebbe avere un metodo returnResult(..)
)
Nota: questo è un rischio per la sicurezza: qualsiasi codice JS in questa pagina Web potrebbe accedere/chiamare l'oggetto Java associato. È meglio passare alcuni cookie monouso a loadUrl() e passarli indietro dell'oggetto Java per verificare che sia il tuo codice a effettuare la chiamata.
La pagina dello sviluppatore Android parla anche di questo rischio per la sicurezza. - Suppongo che non ci sia alcun rischio se il 'JavascriptInterface' contiene solo metodi che sono pensati per essere raggiungibili da JavaScript, ed è per questo che l'annotazione @JavascriptInterface è stata introdotta in JellyBean (api 17)? – Maarten
@ peter-knego Che tipo dovrei usare per il parametro in 'returnResult (..)'? Ad esempio, voglio restituire 'document.getElementsByClassName ('someclass')' che è di tipo HTMLCollection, ma non esiste tale tipo in Java? Se uso solo String o Object come tipo di parametro, restituirà null e "undefined" .. –
Mi chiedo se questo potrebbe essere eccessivo per me. Tutto quello che voglio fare è analizzare una tabella HTML sul mio sito web. Sto ancora cercando modi per farlo. Ho una funzione javascript che trasforma il tavolo in json, ho solo bisogno di un modo per farlo entrare in java. – James
Al fine di corrispondere le chiamate ai metodi della IOS WebviewJavascriptBridge (https://github.com/marcuswestin/WebViewJavascriptBridge), ho fatto alcuni proxy per le chiamate di register_handle
e call_handle
. Si prega di notare che non sono un Javascript-guru quindi probabilmente c'è una soluzione migliore.
javascriptBridge = (function() {
var handlers = {};
return {
init: function() {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
JSInterface[name](param);
} else {
JSInterface[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
In questo modo è possibile inviare da JavaScript a Java chiamate che possono avere un parametro String
javascriptBridge.callHandler("login", JSON.stringify(jsonObj));
le chiamate verso il basso a
@JavascriptInterface
public void login(String credentialsJSON)
{
Log.d(getClass().getName(), "Login: " + credentialsJSON);
new Thread(new Runnable() {
public void run() {
Gson gson = new Gson();
LoginObject credentials = gson.fromJson(credentialsJSON, LoginObject.class);
SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(credentials));
}
}).start();
}
e si può richiamare per JavaScript con
javascriptBridge.registerHandler('successfullAuthentication', function() {
alert('hello');
})
e
private Handler webViewHandler = new Handler(Looper.myLooper());
webViewHandler.post(
new Runnable()
{
public void run()
{
webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();"
}
}
);
Se è necessario passare un parametro, serializzare a stringa JSON quindi chiamare StringEscapeUtils.escapeEcmaScript(json)
, altrimenti si ottiene unexpected identifier: source (1)
errore.
Un po 'appiccicoso e hacky, ma funziona. Devi solo rimuovere il seguente.
connectWebViewJavascriptBridge(function(bridge) {
}
EDIT:
al fine di cambiare la variabile globale ad una effettiva proprietà, ho cambiato il codice di cui sopra al seguente:
(function(root) {
root.bridge = (function() {
var handlers = {};
return {
init: function() {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
Android[name](param);
} else {
Android[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
})(this);
Ho avuto l'idea da Javascript global module or global variable.
È possibile utilizzare la libreria Rhino
per eseguire JavaScript senza WebView.
Download Rhino prima, decomprimerlo, inserire il js.jar file nella cartella libs. È molto piccolo, quindi non devi preoccuparti che il tuo file apk sarà ridicolmente grande a causa di questo vaso esterno.
Ecco un semplice codice per eseguire il codice JavaScript.
Object[] params = new Object[] { "javaScriptParam" };
// Every Rhino VM begins with the enter()
// This Context is not Android's Context
Context rhino = Context.enter();
// Turn off optimization to make Rhino Android compatible
rhino.setOptimizationLevel(-1);
try {
Scriptable scope = rhino.initStandardObjects();
// Note the forth argument is 1, which means the JavaScript source has
// been compressed to only one line using something like YUI
rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null);
// Get the functionName defined in JavaScriptCode
Object obj = scope.get(functionNameInJavaScriptCode, scope);
if (obj instanceof Function) {
Function jsFunction = (Function) obj;
// Call the function with params
Object jsResult = jsFunction.call(rhino, scope, scope, params);
// Parse the jsResult object to a String
String result = Context.toString(jsResult);
}
} finally {
Context.exit();
}
È possibile visualizzare ulteriori dettagli allo my post.
Per un'implementazione completa di JavaScript che non richiede l'utilizzo di una visualizzazione Web lenta, vedere AndroidJSCore, che è una porta completa di JavaScriptCore di Webkit per Android.
Richiamo funzioni da Android è molto semplice:
JSContext context = new JSContext();
String script =
"function factorial(x) { var f = 1; for(; x > 1; x--) f *= x; return f; }\n" +
"var fact_a = factorial(a);\n";
context.evaluateScript("var a = 10;");
context.evaluateScript(script);
JSValue fact_a = context.property("fact_a");
System.out.println(df.format(fact_a.toNumber())); // 3628800.0
La versione 2.0 ha un ingombro molto ridotto.
- 1. Come chiamare una funzione javascript direttamente da un'attività in Android?
- 2. Chiamare JavaScript direttamente da TypeScript
- 3. Come chiamare una funzione JavaScript da PHP?
- 4. Come chiamare SOAP WS da Javascript/jQuery
- 5. come chiamare API REST da JavaScript
- 6. Chiamare funzione di jQuery da JavaScript
- 7. Chiamare i metodi C# BHO da Javascript
- 8. Chiamare una funzione JavaScript da C++
- 9. Come chiamare un'applicazione Android da un'altra applicazione Android
- 10. Chiamare il codice Dart da javascript
- 11. Chiamare il metodo BHO da Javascript?
- 12. Chiamare le funzioni Javascript da un'applet Java
- 13. Chiamare la funzione php da JavaScript
- 14. Come chiamare una funzione codebehind da javascript in asp.net?
- 15. Come chiamare un metodo di controllo da Javascript
- 16. Come posso chiamare i metodi del servizio web da javascript?
- 17. Come trovare e chiamare il metodo javascript da vba
- 18. Webview Swift: come chiamare codice swift corretto da javascript?
- 19. Come chiamare il metodo lato server node.js da javascript?
- 20. Come chiamare la funzione javascript da code-behind
- 21. Come chiamare il metodo dichiarato in applet da javascript
- 22. javax script come chiamare una funzione in JavaScript da Java
- 23. Come chiamare la funzione java GWT da Javascript?
- 24. Chiamare API REST da un'app per android
- 25. Android per chiamare da un numero virtuale
- 26. Android - Come eseguire l'intento da JavaScript
- 27. Come chiamare un webservice PHP da Android usando KSOAP2?
- 28. Come chiamare un servizio Web .NET da Android?
- 29. Come chiamare un servizio Web locale da un'applicazione mobile Android
- 30. Come chiamare un cookie javascript in servlet?
Basta controllare un problema [WebView non ha modo di chiamare JavaScript da Java] (http://code.google.com/p/android/issues/detail?id=742) all'indirizzo code.google.com –
La soluzione per ora è quello di caricare un'URL JavaScript, ad esempio: webview.loadUrl ("javascript: (function() {" + "document.getElementsByTagName ('body') [0] = .style.color 'rosso';" + "})()"); In un certo senso sembra davvero elegante e ovvio una volta che lo si vede, ma è ancora non ancora elegante come un metodo per eseguire direttamente JavaScript. Questo fa dimostrano, tuttavia, che l'implementazione di tale metodo sarebbe facile. –