使用PhoneGap从Android调用Javascript

使用PhoneGap从Android调用Javascript,第1张

概述我有和PhoneGap构建的应用程序,我正在尝试使用本机代码与 Javascript进行通信. 在我的DroidGap扩展类中: @Overridepublic void onCreate(Bundle savedInstanceState) { Logger.log("oncreate"); super.onCreate(savedInstanceState); sup 我有和PhoneGap构建的应用程序,我正在尝试使用本机代码与 Javascript进行通信.

在我的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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1122953.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存