Intereting Posts
Анимация при изменении текста Отсутствует разрешение Bluetooth, но мое приложение не использует его Android: GestureDetector не работает (gestureDetector.onTouchEvent (событие) всегда false) с вкладками (TabActivity, Tabwidget) Android – приложение для индексирования приложений Firebase не отображается в предложениях автозаполнения google Как определить входящий звонок и исходящий вызов в android Получить абсолютный путь к папке с ресурсами в PhoneGap Исключение Java.lang.Runtime: Сбой при съемке? Недопустимый JAVA_HOME при сборке с кордорой Где отменить разрешения Google API, предоставленные на Android? Фрагмент без активности Nexus 6 и MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); Нет хранилища, найденного в Crashlytics install for eclipse AlertDialog с положительной кнопкой и проверка пользовательского EditText Нарисовать закругленную краевую дугу в андроиде с рельефным эффектом Приложение не запускается в визуальном студийном эмуляторе для Android в visual studio 2015

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

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

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

Solutions Collecting From Web of "Связь между Android Java и Phonegap Javascript?"

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

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

    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 вызове window.MyCls методы:

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

Заметка:

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

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

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.

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

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

  1. Создайте новый экземпляр BarcodeScanner в javascript и зарегистрируйте его. Это доступно в javascript как window.plugins.barcodeScanner

  2. Регистрирует настраиваемый класс Plugin с именем службы. Это имя службы передается как первый аргумент PhoneGap.exec, так что PhoneGap может создать экземпляр класса java plugin и вызвать на нем метод 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, используя вышеприведенный код, сначала выполните super.oncreate (), а затем super..init ()

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

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

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

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

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