Связь между Android Java и Phonegap Javascript?


Я считаю, что можно вызвать методы Java из (PhoneGap) Javascript.

кто-нибудь знает, как это сделать?? (Я знаю, как это сделать, изменив исходный код PhoneGap, но я бы этого избежал)

6 78

6 ответов:

Я, наконец, заставил его работать.

  • создать класс с методами, которые вы хотите использовать:

    public class MyClass {
      private WebView mAppView;
      private DroidGap mGap;
    
      public MyClass(DroidGap gap, WebView view)
      {
        mAppView = view;
        mGap = gap;
      }
    
      public String getTelephoneNumber(){
        TelephonyManager tm = 
          (TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
        String number = tm.getLine1Number();
        return number;
      }
    }
    
  • в вашей основной деятельности добавить интерфейс Javascript для этого класса:

    public class Main extends DroidGap
    {
        private MyClass mc;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            super.init();
    
            mc = new MyClass(this, appView);
            appView.addJavascriptInterface(mc, "MyCls");
    
            super.loadUrl(getString(R.string.url));
        }
    }
    
  • в окне вызова Javascript.Методы MyCls:

    <script>
      $(function(){
        $("#phone").text("My telephone number is: " + 
                window.MyCls.getTelephoneNumber());
      });
    </script>
    

Примечание:

как уже упоминалось в комментарии, для Android версии 4.2 и выше, добавьте @JavascriptInterface к методу, который вы хотите получить доступ с вашей HTML-страницы. ссылка.

addJavaScriptInterface(mc, "MyCls") без пробелов init()ed может вызвать раздавление приложения, вам лучше добавить super.init() до addJavascriptInterface()

public class Main extends DroidGap
{
   private MyClass mc;

   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState);

       super.init();

       mc = new MyClass(this, appView);
       appView.addJavascriptInterface(mc, "MyCls");

       super.loadUrl(getString(R.string.url));
   }
}

PhoneGap имеет приличный плагин API. Вы бы написали плагин на Java, реализовав интерфейс IPlugin. Большая часть магии находится в функции execute ().

public interface IPlugin {

    /**
     * Executes the request and returns PluginResult.
     *
     * @param action        The action to execute.
     * @param args          JSONArry of arguments for the plugin.
     * @param callbackId    The callback id used when calling back into JavaScript.
     * @return              A PluginResult object with a status and message.
     */
    PluginResult execute(String action, JSONArray args, String callbackId);

        // ... more ...
}

лучший способ начать писать плагин-это сначала написать JavaScript API. Обычно вы начинаете с написания пользовательского класса javascript, и в каждом методе класса javascript маршалируйте переменные и вызывайте плагин, который вы разработали с помощью Phonegap.метод exec (). Вот сигнатура метода для вашей справки.

/* src/com/phonegap/api/PluginManager.java */
/**
 * Receives a request for execution and fulfills it by finding the appropriate
 * Java class and calling it's execute method.
 *
 * PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
 * string is returned that will indicate if any errors have occurred when trying to find
 * or execute the class denoted by the clazz argument.
 *
 * @param service       String containing the service to run
 * @param action        String containt the action that the class is supposed to perform. This is
 *                      passed to the plugin execute method and it is up to the plugin developer
 *                      how to deal with it.
 * @param callbackId    String containing the id of the callback that is execute in JavaScript if
 *                      this is an async plugin call.
 * @param args          An Array literal string containing any arguments needed in the
 *                      plugin execute method.
 * @param async         Boolean indicating whether the calling JavaScript code is expecting an
 *                      immediate return value. If true, either PhoneGap.callbackSuccess(...) or
 *                      PhoneGap.callbackError(...) is called once the plugin code has executed.
 *
 * @return              JSON encoded string with a response message and status.
 */
@SuppressWarnings("unchecked")
public String exec(final String service, final String action,
    final String callbackId, final String jsonArgs,
    final boolean async)

Вам также необходимо зарегистрировать плагин. Это можно сделать, добавив регистрационный код в нижней части пользовательской библиотеки javascript.

В приведенном ниже примере автор определил класс JavaScript BarcodeScanner и регистрирует его с помощью метода addConstructor.

в addConstructor выполняются два шага:

  1. создайте новый экземпляр BarcodeScanner в javascript и зарегистрируйте его. Этот доступен в javascript как окно.подключаемый модуль.кода

  2. регистрирует пользовательский класс плагина с именем службы. Это имя службы передается в качестве первого аргумента в PhoneGap.exec так что PhoneGap можно создать экземпляр класса плагина java и вызвать метод execute () на нем.

пример регистрационного кода:

PhoneGap.addConstructor(function() {
    /* The following registers an instance of BarcodeScanner in window.plugins.barcodeScanner */
    PhoneGap.addPlugin('barcodeScanner', new BarcodeScanner());

    /* The following associates a service name BarcodeScanner with a class com.beetight.barcodescanner.BarcodeScanner */
    /* The service name is the first argument passed into PhoneGap.exec */
    PluginManager.addService("BarcodeScanner","com.beetight.barcodescanner.BarcodeScanner");
});

более простой форме:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.init(); 
    super.appView.getSettings().setJavaScriptEnabled(true);
    super.appView.addJavascriptInterface(this, "MyCls");
    super.loadUrl("file:///android_asset/www/login.html");
}

Если кто-то получает исключение nullPointer, используя приведенный выше код, сделайте супер.сначала oncreate (), а затем super..init ()

super.onCreate(savedInstanceState);
super.init();

Я нашел это решение здесь: Phonegap Google Group

большое спасибо @zorglub76 за решение....

связь из JavaScript в native достигается путем переопределения функции JavaScript prompt в собственном коде Android, и переданное сообщение очень похоже на то, что используется в iOS. Мы привыкли использовать WebView.addJavascriptInterface для добавления объектов Java непосредственно в песочницу JavaScript, но это приводило к сбою некоторых устройств с Android 2.3. Для вызова JavaScript из native мы в настоящее время используем WebView.loadUrl ("javascript:...") но у этого есть некоторые проблемы, поэтому мы скоро перейдем к опросу a Очередь сообщений Java, вызывающая локальный HTTP-сервер через долговременное соединение XHR.

описание здесь