Зв'язок між Android Java та Phonegap Javascript?


81

Я вважаю, що можна викликати методи Java із (PhoneGap) Javascript.

Хтось знає, як це зробити ?? (Я знаю, як це зробити, змінивши вихідний код PhoneGap, але я б цього уникнув)

Відповіді:


125

Нарешті я змусив це працювати.

  • Створіть клас із методами, які ви хочете використовувати:

    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-сторінки. Довідково .


хм, цей приклад чудовий, але я отримую виняток nullpointer на appView, він здається нульовим. Де ви ініціалізуєте об'єкт?
最 白 目

1
додавання super.init (); як @Karfield, згаданий нижче, виправив для мене виняток nullpointer.
Ренато Х.

8
Чудова робота! Порада: якщо ви хочете спілкуватися навпаки (з Java на Javascript), використовуйте це: mGap.sendJavascript ("window.myJavascriptFunction ('деякий параметр');");
aeldron

5
E / Web Console (2513): Uncaught TypeError: Object [object Object] не має методу 'sendEmail' у файлі: ///android_asset/www/loginfile.js: 142 window.Mycls.sendEmail ("rea@gmail.com" ); отримати помилку на цьому рядку
Deepu Mandy

2
Я спробував цей код для android 4.2.2, я зіткнувся з проблемою, подібною до Deepu, тобто Uncaught TypeError: Object [object Object] не має методу 'getTelephoneNumber' у файлі: ///android_asset/www/app.js: 142. Після деякої налагодження я виявив, що вам потрібно додати @JavascriptInterface для доступу до будь-якого методу, до якого ви хочете отримати доступ у javascript за посиланням
Акшай,

14

addJavaScriptInterface(mc, "MyCls")без Gap 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));
   }
}

9

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 ...
}

Найкращий спосіб почати писати плагін - це спочатку написати API JavaScript. Типово можна почати з написання власного класу 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 як window.plugins.barcodeScanner

  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");
});

Для якої версії фонегапу призначений цей зразок? Я думаю, ви говорите про нижче 2.0. Правда?
Anas Azeem

6

простіша форма:

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");
}

5

Якщо хтось отримає виняток nullPointer, використовуючи наведений вище код, спочатку зробіть super.oncreate (), а потім super..init ()

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

Я знайшов це рішення тут: Phonegap Google Group

Велике спасибі @ zorglub76 за рішення ....


0

Зв’язок від JavaScript до рідного коду досягається шляхом заміни функції підказки JavaScript у власному коді Android, і передане повідомлення приблизно нагадує повідомлення, яке використовується в iOS. Раніше ми використовували WebView.addJavascriptInterface для додавання об’єктів Java безпосередньо до пісочниці JavaScript, але це спричиняло збій деяких пристроїв з Android 2.3. Для виклику JavaScript із власного тексту ми в даний час використовуємо WebView.loadUrl (”javascript:…”), але це має певні проблеми, тому незабаром ми переходимо до опитування черги повідомлень Java, що викликає локальний сервер HTTP через довгоживуче з'єднання XHR.

Опис тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.