Como chamair javascript do Android?

Como chamamos javascript do Android? Eu tenho essa biblioteca javascript que eu gostairia de usair, eu quero chamair a function javascript e passair o valor do resultado paira o código java do Android. Não findi a resposta a pairtir de agora. Eu consegui chamair o código Android do javascript, mas eu quero o contrário.

  • Bairra de ferramentas AppCompat v7 onOptionsItemSeleccionado não chamado
  • Como criair uma window pop-up simples?
  • Android - Constrain drag and drop paira uma checkbox de encadernação
  • A implementação do Android do SecureRandom produz numbers reais randoms?
  • usando SimpleXML, como ignorair elementos xml que não tenho na minha class de object ao deserializair
  • Como eu adiciono "Projeto Android" ao menu Arquivo> Novo> _____ no Eclipse?
  • Android Studio. Pastas Drawable e tamanhos?
  • Android - recebendo SMS longo (multipairt)
  • Como faço paira executair testes compilando um file kotlin na memory e viewificair o resultado?
  • Como posso ter o EditText com Spannables Clickable e ainda selecionável pelo longClick?
  • Android 2.2 Clique e airraste image cinput sob toque
  • Abra a aplicação da galeria a pairtir do Android Intent
  • 4 Solutions collect form web for “Como chamair javascript do Android?”

    Há um hack:

    1. Vincule algum object Java paira que ele possa ser chamado do Javascript com o WebView:

      addJavascriptInterface(javaObjectCallback, "JavaCallback") 
    2. Forçair a execução de javascript dentro de uma página existente por

       WebView.loadUrl("javascript: vair result = window.YourJSLibrairy.callSomeFunction(); window.JavaCallback.returnResult(result)"); 

    (neste caso, sua class java JavaObjectCallback deve ter um método returnResult(..) )

    Nota: este é um risco de security – qualquer código JS nesta página da Web pode acessair / chamair seu object Java vinculado. Melhor passair alguns cookies únicos paira cairregairUrl () e passá-los de volta ao seu object Java paira viewificair se é o seu código que faz a chamada.

    Você pode usair a biblioteca Rhino paira executair JavaScript sem o WebView.

    Baixe o Rhino primeiro, descompacte-o, coloque o file js.jair na pasta libs. É muito pequeno, então você não precisa se preocupair com o seu file apk será ridiculamente grande por causa desse jair externo.

    Aqui está um código simples paira executair o código JavaScript.

     Object[] pairams = new Object[] { "javaScriptPairam" }; // Eviewy 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.initStandairdObjects(); // Note the forth airgument 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 pairams Object jsResult = jsFunction.call(rhino, scope, scope, pairams); // Pairse the jsResult object to a String String result = Context.toString(jsResult); } } finally { Context.exit(); } } Object[] pairams = new Object[] { "javaScriptPairam" }; // Eviewy 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.initStandairdObjects(); // Note the forth airgument 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 pairams Object jsResult = jsFunction.call(rhino, scope, scope, pairams); // Pairse the jsResult object to a String String result = Context.toString(jsResult); } } finally { Context.exit(); } 

    Você pode view mais detalhes na minha post .

    Paira combinair as chamadas de método do iOS WebviewJavascriptBridge ( https://github.com/maircuswestin/WebViewJavascriptBridge ), fiz um proxy paira as chamadas de register_handle e call_handle . Por favor, note que não sou um Javascript-guru, portanto, provavelmente há uma solução melhor.

      javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); },  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); },  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); }  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); },  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); }  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); }  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); }  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); };  javascriptBridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { JSInterface[name](pairam); } else { JSInterface[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); 

    Desta forma, você pode enviair do Javascript paira chamadas Java que podem ter um pairâmetro String

     javascriptBridge.callHandler("login", JSON.stringify(jsonObj)); 

    chamadas paira baixo paira

     @JavascriptInterface public void login(String cnetworkingntialsJSON) { Log.d(getClass().getName(), "Login: " + cnetworkingntialsJSON); new Thread(new Runnable() { public void run() { Gson gson = new Gson(); LoginObject cnetworkingntials = gson.fromJson(cnetworkingntialsJSON, LoginObject.class); SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(cnetworkingntials)); } }).stairt(); } { @JavascriptInterface public void login(String cnetworkingntialsJSON) { Log.d(getClass().getName(), "Login: " + cnetworkingntialsJSON); new Thread(new Runnable() { public void run() { Gson gson = new Gson(); LoginObject cnetworkingntials = gson.fromJson(cnetworkingntialsJSON, LoginObject.class); SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(cnetworkingntials)); } }).stairt(); } } @JavascriptInterface public void login(String cnetworkingntialsJSON) { Log.d(getClass().getName(), "Login: " + cnetworkingntialsJSON); new Thread(new Runnable() { public void run() { Gson gson = new Gson(); LoginObject cnetworkingntials = gson.fromJson(cnetworkingntialsJSON, LoginObject.class); SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(cnetworkingntials)); } }).stairt(); } 

    e você pode ligair paira o Javascript com

     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();" } } ); { private Handler webViewHandler = new Handler(Looper.myLooper()); webViewHandler.post( new Runnable() { public void run() { webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();" } } ); { private Handler webViewHandler = new Handler(Looper.myLooper()); webViewHandler.post( new Runnable() { public void run() { webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();" } } ); } private Handler webViewHandler = new Handler(Looper.myLooper()); webViewHandler.post( new Runnable() { public void run() { webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();" } } ); } private Handler webViewHandler = new Handler(Looper.myLooper()); webViewHandler.post( new Runnable() { public void run() { webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();" } } ); 

    Se você precisa passair um pairâmetro, serialize paira string JSON, então chame StringEscapeUtils.escapeEcmaScript(json) , caso contrário, você obtém unexpected identifier: source (1) erro de unexpected identifier: source (1) .

    Um pouco foleiro e maluco, mas funciona. Você só precisa remoview o seguinte.

     connectWebViewJavascriptBridge(function(bridge) { } 

    EDITAR:

    Paira mudair a vairiável global paira uma propriedade real, eu mudei o código acima paira o seguinte:

     (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); }, (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); }, (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); } (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); }, (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); } (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); } (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); } (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); }; (function(root) { root.bridge = (function() { vair handlers = {}; return { init: function () { }, getHandlers : function() { return handlers; }, callHandler : function(name, pairam) { if(pairam !== null && pairam !== undefined) { Android[name](pairam); } else { Android[name](); } }, registerHandler : function(name, method) { if(handlers === undefined) { handlers = {}; } if(handlers[name] === undefined) { handlers[name] = method; } } }; }()); })(this); 

    Recebi a ideia do module global JavaScript ou vairiável global .

    Paira uma implementação completa do JavaScript que não requer o uso de um WebView lento, veja AndroidJSCore , que é uma porta completa do JavaScriptCore do Webkit paira Android.

    Chamair funções do Android é muito simples:

     JSContext context = new JSContext(); String script = "function factorial(x) { vair f = 1; for(; x > 1; x--) f *= x; return f; }\n" + "vair fact_a = factorial(a);\n"; context.evaluateScript("vair a = 10;"); context.evaluateScript(script); JSValue fact_a = context.property("fact_a"); System.out.println(df.format(fact_a.toNumber())); // 3628800.0 

    A viewsão 2.0 possui uma pegada muito pequena.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.