我們如何從Android調用JavaScript?我有這個JavaScript庫,我想使用,我想調用JavaScript函數,並將結果值傳遞給Android Java代碼。從現在起還沒有找到答案。我設法從javascript調用android代碼,但我想要其他方式。如何從Android調用JavaScript?
回答
有一個hack:
綁定一些Java對象,以便它可以通過JavaScript調用的WebView:
addJavascriptInterface(javaObjectCallback, "JavaCallback")
隊由
現有頁面內執行的JavaScriptWebView.loadUrl("javascript: var result = window.YourJSLibrary.callSomeFunction(); window.JavaCallback.returnResult(result)");
(在這種情況下,你的java類JavaObjectCallback
應該有一個方法returnResult(..)
)
注:這是一個安全風險 - 任何JS代碼在這個網頁可以訪問/調用你綁定的Java對象。最好將一些一次性cookies傳遞給loadUrl()並將它們傳回給Java對象以檢查它是否是您的代碼進行調用。
Android開發人員的頁面也提到了這種安全風險。 - 如果'JavascriptInterface'只包含可以從JavaScript訪問的方法,那麼我認爲沒有風險,這就是爲什麼@JavascriptInterface註釋是在JellyBean(api 17)中引入的? – Maarten
@ peter-knego我應該在'returnResult(..)'中使用什麼類型的參數?例如,我想返回類型爲HTMLCollection的document.getElementsByClassName('someclass')',但是Java中沒有這種類型?如果我只是使用String或Object作爲參數類型,它將返回null和「undefined」。 –
我想知道這是否對我來說可能是矯枉過正的。我想要做的就是在我的網站上解析一個HTML表格。我仍在尋找方法來做到這一點。我有一個JavaScript函數將錶轉換爲json,我只需要一種方法來獲取它在Java中。 – James
爲了匹配iOS的WebviewJavascriptBridge(https://github.com/marcuswestin/WebViewJavascriptBridge)的方法調用,我做了一些代理爲register_handle
和call_handle
呼叫。請注意,我不是一個JavaScript大師,因此可能有更好的解決方案。
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;
}
}
};
}());
這樣你就可以從Javascript發送到Java調用,可以有一個字符串參數
javascriptBridge.callHandler("login", JSON.stringify(jsonObj));
調用到
@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();
}
,您可以用
回調的JavascriptjavascriptBridge.registerHandler('successfullAuthentication', function() {
alert('hello');
})
和
private Handler webViewHandler = new Handler(Looper.myLooper());
webViewHandler.post(
new Runnable()
{
public void run()
{
webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();"
}
}
);
如果你需要傳遞一個參數,序列化到JSON字符串,然後調用StringEscapeUtils.escapeEcmaScript(json)
,否則你得到unexpected identifier: source (1)
錯誤。
有點俗氣和哈克,但它的作品。你只需要刪除以下內容。
connectWebViewJavascriptBridge(function(bridge) {
}
編輯:
,以全局變量更改爲實際的屬性,我改變了上面的代碼如下:
(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);
您可以使用Rhino
庫沒有的WebView執行JavaScript。
Download Rhino第一,解壓縮後,把JS。jar文件在libs文件夾下。它非常小,所以你不必擔心你的apk文件會因爲這個外部的jar而變得很大。
下面是執行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();
}
你可以在my post看到更多詳細信息。
要完整實現不需要使用慢速WebView的JavaScript,請參閱AndroidJSCore,這是Webkit的JavaScriptCore for Android的完整端口。
從Android的調用函數是非常簡單的:
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
2.0版有一個非常小的足跡。
- 1. 如何從android中調用javascript方法
- 2. 從Java調用Javascript - Android
- 3. 如何從JavaScript調用JsonResult?
- 4. 如何從JavaScript調用FileReference.browse()?
- 5. 如何從JavaScript調用
- 6. 如何從Javascript調用Ajax?
- 7. 使用PhoneGap從Android進行Javascript調用
- 8. 如何調用JavaScript中的Android
- 9. 如何調用Android中的JavaScript 4.2
- 10. 如何直接從Android中的活動調用JavaScript函數?
- 11. 如何從android中的javascript函數調用原生cordova插件?
- 12. 如何從android片段調用JavaScript函數?
- 13. 如何從phonegap javascript調用此android bluetooth打印程序?
- 14. 從javascript調用javascript
- 15. 從android中調用javascript方法
- 16. 從android活動調用javascript函數
- 17. 從服務中調用Javascript android
- 18. 如何從iFrame調用Javascript函數?
- 19. 如何從Kotlin調用JavaScript刪除?
- 20. 如何從tapestry代碼調用javascript?
- 21. 如何從JavaScript調用WCF服務?
- 22. 如何從地址欄調用JavaScript?
- 23. 如何從JavaScript調用Objective-C函數?
- 24. 如何從JavaScript調用Java方法
- 25. 如何從JavaScript調用點擊事件?
- 26. 如何從Javascript調用MessagePack RPC服務?
- 27. 如何從JavaScript調用外部CSS?
- 28. 如何從href調用javascript函數?
- 29. 如何從javascript調用jquery驗證?
- 30. 如何從javascript調用html頁面div?
只需在code.google.com上檢查問題[WebView無法從Java調用JavaScript](http://code.google.com/p/android/issues/detail?id=742) –
解決方案現在是加載一個JavaScript URL,例如: webview.loadUrl(「javascript:(function(){」+ 「document.getElementsByTagName('body')[0] .style.color ='red';」 +「})()」); 從某些方面來看,一旦你看到它,它就顯得非常優雅和明顯,但是它的 仍然不如直接執行JavaScript的方法那麼優雅。但是, 表明,實施這種方法很容易。 –