Связь между Android Java и Phonegap Javascript?
Я считаю, что можно вызвать методы Java из (PhoneGap) Javascript.
кто-нибудь знает, как это сделать?? (Я знаю, как это сделать, изменив исходный код PhoneGap, но я бы этого избежал)
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 выполняются два шага:
создайте новый экземпляр BarcodeScanner в javascript и зарегистрируйте его. Этот доступен в javascript как окно.подключаемый модуль.кода
регистрирует пользовательский класс плагина с именем службы. Это имя службы передается в качестве первого аргумента в 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.