
在我的DroIDGap扩展类中:
@OverrIDepublic voID onCreate(Bundle savedInstanceState) { Logger.log("oncreate"); super.onCreate(savedInstanceState); super.init(); super.appVIEw.getSettings().setJavaScriptEnabled(true); super.appVIEw.getSettings().setSupportZoom(true); super.appVIEw.getSettings().setBuiltInZoomControls(true); super.appVIEw.getSettings().setdisplayZoomControls(false); Jsinterface = new CommunicationInterface(this,appVIEw); super.appVIEw.addJavaScriptInterface(Jsinterface,"communicationinterface"); } JavaScript接口:
public class CommunicationInterface { private WebVIEw mAppVIEw; private DroIDGap mGap; public CommunicationInterface(DroIDGap gap,WebVIEw vIEw) { mAppVIEw = vIEw; mGap = gap; } public String getTestString() { return "teststring"; } public voID parse(Object o) { Logger.log(o); }} Javacript位于外部文件中(我创建了一个HTML文件,标题中包含以下行:< script type =“text / JavaScript”src =“scripts.Js”>< / script>)
scripts.Js中:
function sendToInterface() { alert("alert"); var map = new Object(); (...) window.communicationinterface.parse(map); //communication Js -> androID seems to work.} 我在其他帖子中读到可以在PhoneGap和AndroID之间进行通信,但是因此我没有取得任何成功.我确实设法创建了一个警报,但那是使用loadUrl(“JavaScript:alert(‘Alert’);”),但我也读过你不应该这样做,因为这就是sendJavaScript()的用途(和它一样)导致泄漏,重新加载页面等).我试图通过sendJavaScript()方法拍摄几个字符串,但无济于事:
> sendJavaScript(“JavaScript:alert(‘Alert’);”)
> sendJavaScript(“JavaScript:sendToInterface();”)
> sendJavaScript(“sendToInterface();”)
> sendJavaScript(“window.sendToInterface();”)
如何从本地传播 – > PhoneGap(或者我已经拥有的东西有什么问题)?因此,其他帖子和问题并没有帮助我解决这个特殊问题.
读:
> http://www.jumpbyte.com/2012/phonegap-native-to-javascript/
> Phonegap: “processMessage failed” unable to send javascript function (Cordova 2.5.0)
> Communication between Android Java and Phonegap Javascript?(虽然这是另一个方向,但我正在尝试两者兼顾)
> http://www.intelligrape.com/blog/2013/01/31/using-sendjavscript-to-inject-javascript-into-android-phonegap-application/
> Phonegap – Android – Calling javascript from native causes leakedwindow
> how to call javascript function from android using phonegap plugin
编辑
我写了一个工作项目:
Java部分
import org.apache.cordova.DroIDGap;import org.Json.JsONException;import org.Json.JsONObject;import androID.os.Bundle;import androID.util.Log;public class App extends DroIDGap { @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.loadUrl("file:///sdcard/ds/index.HTML"); System.out.println("loading from sdcard"); Thread t = new Thread() { public voID run() { try { for (int i = 0; i < 3; i++) { sleep(2000); sendValue("value " + i,"another vlaue " + i); } } catch (Exception e) { e.printstacktrace(); } }; }; t.start(); } public voID sendValue(String value1,String value2) { System.out.println("sendvalue in app"); JsONObject data = new JsONObject(); try { data.put("value1",value1); data.put("value2",value2); } catch (JsONException e) { Log.e("CommTest",e.getMessage()); } String Js = String.format("window.plugins.appcomm.updateValues('%s');",data.toString()); this.sendJavaScript(Js); }}import org.apache.cordova.API.Plugin;import org.apache.cordova.API.PluginResult;import org.Json.JsONArray;import org.Json.JsONException;import org.Json.JsONObject;import androID.util.Log;public class AppComm extends Plugin{ private static AppComm instance; public AppComm () { instance = this; } public static AppComm getInstance() { return instance; } @OverrIDe public PluginResult execute(String action,JsONArray args,String callbackID) { System.out.println("in execute from appcomm"); return null; } public voID sendValue(String value1,String value2) { System.out.println("sendvalue in appComm"); JsONObject data = new JsONObject(); try { data.put("value1",e.getMessage()); } String Js = String.format( "window.plugins.commtest.updateValues('%s');",data.toString()); this.sendJavaScript(Js); }} RES / XML / plugins.xml
<plugins> <plugin name="App" value="org.apache.cordova.App"/> <plugin name="Geolocation" value="org.apache.cordova.Geobroker"/> <plugin name="Device" value="org.apache.cordova.Device"/> <plugin name="Accelerometer" value="org.apache.cordova.AccelListener"/> <plugin name="Compass" value="org.apache.cordova.CompassListener"/> <plugin name="Media" value="org.apache.cordova.AudioHandler"/> <plugin name="Camera" value="org.apache.cordova.CameraLauncher"/> <plugin name="Contacts" value="org.apache.cordova.ContactManager"/> <plugin name="file" value="org.apache.cordova.fileUtils"/> <plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/> <plugin name="Notification" value="org.apache.cordova.Notification"/> <plugin name="Storage" value="org.apache.cordova.Storage"/> <plugin name="Temperature" value="org.apache.cordova.TempListener"/> <plugin name="fileTransfer" value="org.apache.cordova.fileTransfer"/> <plugin name="Capture" value="org.apache.cordova.Capture"/> <plugin name="Battery" value="org.apache.cordova.BatteryListener"/> <plugin name="SplashScreen" value="org.apache.cordova.SplashScreen"/> <plugin name="AppComm" value="com.example.plugin.AppComm"/></plugins>
cordova.xml
<?xml version="1.0" enCoding="utf-8"?><cordova> <access origin=".*"/> <!-- allow local pages --> <log level="DEBUG"/> <preference name="classicRender" value="true" /></cordova>
Index.HTML标题
<head> <Meta charset="utf-8" /> <Meta name="vIEwport" content="wIDth=device-wIDth,initial-scale=1,maximum-scale=1.0" /> <Title> </Title> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.CSS" /> <script src="http://AJAX.GoogleAPIs.com/AJAX/libs/jquery/1.7.1/jquery.min.Js"> </script> <script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.Js"> </script> <script type="text/JavaScript" charset="utf-8" src="cordova.Js"></script> <script type="text/JavaScript" charset="utf-8"> var AppComm=function(){}; AppComm.prototype.updateValues=function(a){ var map = new Object(); map["X1"] = "hallo"; map["X2"] = "hi"; cordova.exec(null,null,null); }; cordova.addConstructor(function(){cordova.addplugin("appcomm",new AppComm)}); </script></head> 其中一个问题是JavaScript是在一个单独的文件中(我认为这是其中一个问题).如果不是要问太多,我怎样才能正确地调用java,并用什么值?如何实现execute方法以及如何调用它(我在Jquery中真的很糟糕)?
解决方法 首先,您使用的是Plugin子类.插件已被弃用,已被CordovaPlugin取代.如果您使用旧版本的PhoneGap,我建议您升级.其次,你的执行电话是错误的.插件开发的文档明确指出你必须传递5个参数,而你传递3个空值.您如何期待处理?
cordova.exec(function(winParam) {},function(error) {},"service","action",["firstArgument","secondArgument",42,false]); 这里,服务, *** 作和参数数组决定了Java代码中会发生什么.前两个决定了在某些条件下JavaScript会发生什么.因此,虽然您可以为前两个使用null,但您必须指定最后三个.
我有一个适用于PhoneGap 2.3.0的工作示例插件.请参阅以下代码:
public class ExampleJsCommunicator extends CordovaPlugin { public boolean execute (final String action,final JsONArray args,CallbackContext callbackContext) throws JsONException { PluginResult.Status status = PluginResult.Status.OK; String result = ""; cordova.getActivity ().runOnUiThread (new Runnable () { @OverrIDe public voID run() { try { String displayText = ""; if (action.equals ("buttonClicked")) { displayText = args.getString(0) + " was clicked"; } else if (action.equals ("animationRunning")) { displayText = args.getBoolean(0) ? "Animation started running" : "Animation stopped running"; } TextVIEw label = (TextVIEw) cordova.getActivity().findVIEwByID (R.ID.textVIEw); label.setText (displayText + " and the Activity kNows it!"); } catch (JsONException e) { e.printstacktrace(); } } }); return true; }} 使用上面的代码,您可以使用Java端插件来处理两个自定义“ *** 作” – buttonClicked和animationRunning.这些行为符合我的目的,但你可以用其他名称命名.
现在,您仍然需要注册您的插件,以便Cordova了解它.这是在xml / config.xml文件中完成的.在插件下,您必须添加以下内容:
<plugin name="ExampleJsCommunicator" value="com.example.phonegap.ExampleJsCommunicator"/>
然后,您可以从JavaScript传递数据(或“ *** 作”),如下所示.请注意,参数(which.ID和animationRunning在数组中传递):
cordova.exec (null,"ExampleJsCommunicator","buttonClicked",[which.ID]); // my first actioncordova.exec (null,"animationRunning",[animationRunning]); // my second action
这两个exec调用将触发ExampleJsCommunicator类中的execute方法,并将在相应的if块中处理.只要在包含cordova.Js文件后声明JavaScript代码,调用exec的位置无关紧要.我的JavaScript包含在一个单独的main.Js文件中,它可以正常工作:
<script type="text/JavaScript" charset="utf-8" src="cordova.Js"></script><script type="text/JavaScript" charset="utf-8" src="main.Js"></script>总结
以上是内存溢出为你收集整理的使用PhoneGap从Android调用Javascript全部内容,希望文章能够帮你解决使用PhoneGap从Android调用Javascript所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)