【问题标题】:How to call an Android Activity from PhoneGap如何从 PhoneGap 调用 Android Activity
【发布时间】:2011-09-03 10:25:05
【问题描述】:

我是 PhoneGap 的新手,我能够使用 PhoneGap 实现基本应用程序,现在为了进一步增强它,我想将 PhoneGap 与 Android 活动连接起来,基本上我打算使用 javascript 函数调用 startActivity() 方法.

我试过Communication between Android Java and Phonegap Javascript?

但我未能调用活动,导致强制关闭错误。 请帮帮我,等待回复!

【问题讨论】:

    标签: javascript android cordova android-activity


    【解决方案1】:

    在不使用任何插件的情况下调用任何 Java Native 代码,如下所示。

    按照以下步骤操作。

    1. 将以下代码替换为您现有的 DroidGap Activity。

      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          super.init(); // Calling this is necessary to make this work
          appView.addJavascriptInterface(this, "MainActivity");
      
          /* "this" points the to the object of the current activity. "MainActivity" is used to refer "this" object in JavaScript as in Step 3. */
      
          super.loadUrl("file:///android_asset/www/index.html");
      }
      
    2. 在当前(this)活动中添加自定义函数如下。

      public void customFunctionCalled() {
          Log.e("Custom Function Called", "Custom Function Called");
      }
      
    3. 现在从您的 HTML/JavaScript 代码中调用此函数,如下所示。

      <script type="text/javascript">
          function callNewActivity() {
              window.MainActivity.customFunctionCalled();
          }
      </script>
      

    这将在MainActivity 中调用customFunctionCalled()

    测试环境 日食 - 3.7.2 安卓 2.2 模拟器 PhoneGap - 2.0.0

    请在此处提供您的 cmets 以改进博客文章。 http://phonegapexplorers.blogspot.in/2012/08/call-native-java-code-phonegap-android.html

    【讨论】:

    • 我用了很久。但最近 android 4.2.2 出现了一些问题。从网上了解到它与 sdk>=17 一起正常工作。您能告诉我使用 sdk>=17 需要做哪些更改吗??
    • @AvtarSingh Suchariya Hy 我跟着你的教程,但我得到:07-08 23:44:04.845: E/Web Console(25296): Uncaught TypeError: Object [object Object] has no method 'customFunctionCalled ' 在 file:///android_asset/www/js/index.js:31 为什么会这样?我听说如果目标 SDK 为 17 或更高,则必须进行一些修改(我认为这是我的情况)。但我不知道那些是什么。你能帮帮我吗?
    • @AtanuCSE 你知道如何使用带有 sdk>=17 的脚本吗?你能告诉我怎么做吗?
    • @AlexStanese 不,由于我没有使用任何繁重的本机功能,我只是将目标 SDK 降低到 16 以使其暂时正常工作。
    • @AtanuCSE 我明白了!!!只需在“public void customFunctionCalled() {”之前添加“@JavascriptInterface”
    【解决方案2】:

    如果不知道更多关于你正在尝试做什么的事情很难,但是沿着编写插件的道路前进可能是要走的路。退房;

    http://smus.com/android-phonegap-plugins

    这个插件可能适合你,或者给你很好的指导如何自己做。

    【讨论】:

      【解决方案3】:

      尝试创建插件,这里有一些插件示例https://github.com/phonegap/phonegap-plugins

      【讨论】:

        【解决方案4】:

        我尝试过您之前尝试做的事情,将 phonegap 更新到 2.0.0 版及更高版本,最好的方法是使用插件。这是资产文件夹中 phonegap 上的 js。确保构造 id 为“nativecall”的 div 元素和一个示例按钮来检测它。一定要观看 LogCat 以检查错误消息。

            window.echo = function(str, callback) {
            cordova.exec(callback, function(err) {
                callback('Nothing to echo.');
            }, "Echo", "echo", [str]);
        };
        
        var app = {
            // Application Constructor
            initialize: function() {
                this.bindEvents();
            },
            // Bind Event Listeners
            //
            // Bind any events that are required on startup. Common events are:
            // 'load', 'deviceready', 'offline', and 'online'.
            bindEvents: function() {
                document.addEventListener('deviceready', this.onDeviceReady, false);
            },
            // deviceready Event Handler
            //
            // The scope of 'this' is the event. In order to call the 'receivedEvent'
            // function, we must explicity call 'app.receivedEvent(...);'
            onDeviceReady: function() {
                app.receivedEvent('deviceready');
            },
            // Update DOM on a Received Event
            receivedEvent: function() {
        
                var abiter = $('#nativecall').html();
        
                    $("#abutton").click(function () {
                            window.echo(abiter, function(echoValue) {
                            alert(echoValue = abiter); // should alert true.
                        });
                    });
        
        
            }
        };
        
        app.initialize();
        

        在 src 上添加服务名称为“Echo”的新类方法。

            package org.apache.cordova.plugin;
        
        import org.apache.cordova.api.CallbackContext;
        import org.apache.cordova.plugin.AndroidActivities;
        import org.apache.cordova.api.CordovaPlugin;
        import org.json.JSONArray;
        import org.json.JSONException;
        
        /**
         * This class echoes a string called from JavaScript.
         */
        public class Echo extends CordovaPlugin {
            @Override
            public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
                if (action.equals("echo")) {
                    String message = args.getString(0);
                    new AndroidPublicFunction(message); //call function from AndroidActivities
                    this.echo(message, callbackContext);
                    return true;
                }
                return false;
            }
        
            private void echo(String message, CallbackContext callbackContext) {
                if (message != null && message.length() > 0) { 
                    callbackContext.success(message);
                } else {
                    callbackContext.error("Expected one non-empty string argument.");
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          相关资源
          最近更新 更多