从js调用带有Phonegap 3.0的活动方法的最佳方法

Posted

技术标签:

【中文标题】从js调用带有Phonegap 3.0的活动方法的最佳方法【英文标题】:Best way to call activity Method with Phonegap 3.0 from js 【发布时间】:2013-09-04 06:10:11 【问题描述】:

我正在尝试使用 MainActivity 中的本机方法从 phonegap 中的 index.html 拨打电话。

我正在使用 phonegap 3.0 和 android 4.3 平台。我在this 帖子上尝试了second answer,但它不适用于这个版本。

我想知道解决此问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您可以创建一个自定义插件来从本机端调用任何方法。创建一个单独的 javascript 文件,例如 customplugin.js,并将其放入其中:

var CustomPlugin = ;

CustomPlugin.callNativeMethod = function() 
    cordova.exec(null, null, "CustomPlugin", "callNativeMethod", []);
;

现在在本机 Java 端,创建一个新类并将其命名为 CustomPlugin.java,然后添加:

package com.yourpackage;

import org.apache.cordova.CordovaWebView;
import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaInterface;
import org.apache.cordova.api.CordovaPlugin;

import com.yourpackage.MainActivity;

public class CustomPlugin extends CordovaPlugin

    private static final String TAG   = "CustomPlugin";

    private CallbackContext callbackContext = null;
    private MainActivity activity = null;

    /** 
     * Override the plugin initialise method and set the Activity as an 
     * instance variable.
     */
    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) 
    
        super.initialize(cordova, webView);

        // Set the Activity.
        this.activity = (MainActivity) cordova.getActivity();
    

    /**
     * Here you can delegate any JavaScript methods. The "action" argument will contain the
     * name of the delegated method and the "args" will contain any arguments passed from the
     * JavaScript method.
     */
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException 
    
        this.callbackContext = callbackContext;

        Log.d(TAG, callbackContext.getCallbackId() + ": " + action);

        if (action.equals("callNativeMethod")) 
        
            this.callNativeMethod();
        
        else
        
            return false;
        

        return true;
    

    private void callNativeMethod()
    
        // Here we simply call the method from the Activity.
        this.activity.callActivityMethod();
    

确保通过添加以下行来映射 config.xml 文件中的插件:

...
<feature name="CustomPlugin">
    <param name="android-package" value="com.yourpackage.CustomPlugin" />
</feature>
...

现在要从 index.html 调用插件,您可以简单地调用 JavaScript 方法:

CustomPlugin.callNativeMethod();

使用此方法可以方便地设置许多自定义方法。更多信息请查看 PhoneGap 插件开发指南here。

【讨论】:

感谢@suprnova,您的回答很有帮助,也许它适用于以前的版本,但我注意到我使用的是最新版本的 phonegap (3.0),我对此进行了编码,但无法正常工作。我收到这个错误 exec() 调用未知插件,我在这里找到了类似的东西 ***.com/questions/17974301/… 你说得对,这不适用于PhoneGap 3.0,但我认为这是因为我在上一个答案中使用的插件映射已被弃用。但是,我已经使用 PhoneGap 3.0 映射更新了我的答案。本质上,config.xml 中的 '` 元素已被弃用,您必须改用元素 &lt;feature&gt; 是的!我在上!一旦我得到这个问题的解决方案,我会发布答案! 完美。我不知道为什么,但我把我的 元素放在 ~/android/www/config.xml 并且没有工作,然后我将它移到 ~/android/res/xml/config.xml 并且工作正常.谢谢@suprnova @benka 你是对的,你确实可以从execute() 方法中调用它。我拥有callNativeMethod() 的唯一原因是您可以使用execute() 方法委托给其他方法。因此,在if-else 语句中,您可以为其他方法添加更多子句。如果您只调用一种方法,则可能值得只使用execute() 方法。【参考方案2】:

完成上述答案的所有内容后,您还需要在 res/xml/config.xml 中添加插件以使其工作

<plugin name="PluginName" value="com.namespace.PluginName"/>

&lt;/plugins&gt; 标签之前

【讨论】:

以上是关于从js调用带有Phonegap 3.0的活动方法的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从活动中调用片段方法

使用 Android 配置 Phonegap 3.0

如何从 InAppBrowser 中调用 Phonegap 插件?

使用带有 HTML5 和 jquery 的 phonegap 1.3.0 创建 android 应用程序时出现无限弹出错误?

从外部 aspx 网站调用 phonegap smscomposer

Phonegap fileTransfer.Download 不适用于 ios phonegap 3.0