如何从cordova 3.x调用本机函数

Posted

技术标签:

【中文标题】如何从cordova 3.x调用本机函数【英文标题】:How to call native function from cordova 3.x 【发布时间】:2014-09-02 04:24:18 【问题描述】:

如何从 cordova/phonegap webview 调用本机函数,例如显示广告。

编辑:好的,我完全明白了,我将为所有不知道该怎么做的人写一些步骤(只是为了节省你一生中的 2 天时间:D)

A) 如果您只有 cordova/phonegap 并且希望从 js 调用,请执行以下操作:

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) 活动中添加自定义函数,如下所示。

@JavascriptInterface
public void customFunctionCalled() 
    Log.e("Custom Function Called", "Custom Function Called");

3) 现在从您的 HTML/JavaScript 代码中调用此函数,如下所示。

 window.MainActivity.customFunctionCalled();

B.1) 如果您在 web 视图中实现了 cordova/phonegap 并希望从 js 调用,请执行以下操作: (并想调用普通函数)

1) 将此添加到主 java 文件中:

JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");

2) 声明类 JavaScriptInterface:

public class JavaScriptInterface 
    private Activity activity;

    public JavaScriptInterface(Activity activiy) 
        this.activity = activiy;
    

    @JavascriptInterface
    public void showLog()
        Log.v("blah", "blah blah");
    


3) 用 `window.JSInterface.showLog() 从 js 调用它;

B.2) 如果您在 web 视图中实现了 cordova/phonegap 并希望从 js 中调用(并且想要调用 UI 函数,例如 toast),请执行以下操作:

1) 将此添加到主 java 文件中:

JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");

2) 声明类 JavaScriptInterface:

public class JavaScriptInterface 
    private Activity activity;

    public JavaScriptInterface(Activity activiy) 
        this.activity = activiy;
    

    @JavascriptInterface
    public void myFunction()
    
        activity.runOnUiThread(new Runnable() 
            public void run() 
                //Code that interact with UI
                showToast();
            
        );

    


3) 在下面添加toast函数:

public void showToast()
    Toast.makeText(getApplicationContext(), "this is my Toast message!!! =)",
               Toast.LENGTH_LONG).show();

4) 使用 `window.JSInterface.myFunction(); 调用它

如您所见,如果您需要一个使用 UI 的函数,您需要将您的函数包装到 activity.runOnUiThread 中,以便可以从 js 中调用它。

*如果你想从 java 调用 jquery 方法,这样做:

Java:

cordova_webview.loadUrl("javascript:window.functionn()");

Javascript:

window.function = punish;

祝你有美好的一天!

【问题讨论】:

【参考方案1】:

在.java文件中

public void onCreate(Bundle savedInstanceState)

    super.onCreate(savedInstanceState);
    super.init(); // Calling this is necessary to make this work

    appView.addJavascriptInterface(this, "MainActivity");

    super.loadUrl(Config.getStartUrl());


在javascript中

window.MainActivity.customFunctionCalled();

这仅适用于 TargetSDK=17 ,我想您需要创建一些自定义插件。我现在使用这个过程来降低我的目标 SDK。

【讨论】:

我不能使用 super.init() 因为我将 pgonegap 集成到 webview 中。如果我添加该行,我会得到错误,我什至无法构建应用程序。

以上是关于如何从cordova 3.x调用本机函数的主要内容,如果未能解决你的问题,请参考以下文章

来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用

iOS - Cordova 如何调用目标 c 函数?

通过 Cordova 插件从 Objective-C 调用 Javascript

Cordova:如何编写可以重复调用 Javascript 回调的本机插件?

Cordova 插件从本机函数获取异步响应

Cordova 6.2.3 没有 WebChromeClient,如何覆盖 onJsPrompt()?