Как вызвать нативную функцию из Cordova 3.x

Как я могу вызвать встроенную функцию из веб-просмотра Cordova/PhoneGap, например, для показа рекламы.

РЕДАКТИРОВАТЬ: ОК, Я ПОНЯЛ ЭТО, и я собираюсь написать несколько шагов для всех вас, кто не знает, как это сделать (просто чтобы сэкономить 2 дня вашей жизни: D)

A) если у вас есть только кордова/телефонная связь и вы хотите позвонить из js, сделайте следующее:

1) Замените следующий код существующей активностью DroidGap.

@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) Добавьте пользовательскую функцию в текущую (эту) активность следующим образом.

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

3) Теперь вызовите эту функцию из кода HTML/JavaScript следующим образом.

 window.MainActivity.customFunctionCalled();

B.1) если у вас есть 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) Вызовите его из js с помощью `window.JSInterface.showLog();

B.2), если у вас есть кордова/телефонная связь, реализованная в веб-просмотре, и вы хотите позвонить из 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 myFunction()
    {
        activity.runOnUiThread(new Runnable() {
            public void run() {
                //Code that interact with UI
                showToast();
            }
        });

    }

}

3) Добавьте функцию тоста ниже:

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

4) Вызовите его с помощью `window.JSInterface.myFunction();

Как видите, если вам нужна функция, использующая пользовательский интерфейс, вам нужно обернуть ее в activity.runOnUiThread, чтобы ее можно было вызывать из js.

* Если вы хотите вызвать из java метод jquery, сделайте следующее:

Ява:

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

Javascript:

window.function = punish;

Хорошего дня!


person Alex Stanese    schedule 11.07.2014    source источник


Ответы (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. Для targetSDK androidManifest.xml необходимо установить ‹ 17. А для TargetSDK >=17, я думаю, вам нужно создать какой-нибудь собственный плагин. Я использую этот процесс, снижая мой целевой SDK на данный момент.

person AtanuCSE    schedule 11.07.2014
comment
Я не могу использовать super.init(), потому что я интегрировал pgonegap в веб-просмотр. Если я добавлю строку, я получаю сообщение об ошибке, и я даже не могу создать приложение. - person Alex Stanese; 12.07.2014