run instalar android cordova

instalar - La comunicación entre Android Java y Phonegap Javascript?



cordova-android npm (6)

Creo que es posible llamar a los métodos Java desde (PhoneGap) Javascript.

¿¿Alguien sabe cómo hacer eso?? (Sé cómo hacerlo cambiando el código fuente de PhoneGap, pero lo evitaría)


Finalmente lo hice funcionar.

  • Crea una clase con los métodos que quieras usar:

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

  • En su actividad principal, agregue una interfaz de Javascript para esta clase:

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

  • En Javascript, llame a la ventana. Métodos MyCls:

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

Nota:

Como se menciona en el comentario, para Android versión 4.2 y superior, agregue @JavascriptInterface al método al que desea acceder desde su página HTML. Reference .


La comunicación de JavaScript a lo nativo se logra anulando la función de aviso de JavaScript en el código nativo de Android y el mensaje pasado es muy parecido al usado en iOS. Solíamos usar WebView.addJavascriptInterface para agregar objetos Java directamente a la zona de pruebas de JavaScript, pero eso causaba que algunos dispositivos fallaran con Android 2.3. Para llamar a JavaScript desde el idioma nativo, actualmente usamos WebView.loadUrl ("javascript: ...") pero eso tiene algunos problemas, por lo que pronto nos moveremos a una cola de mensajes Java que llama a un servidor HTTP local a través de una conexión XHR de larga duración.

Descripción por aquí


PhoneGap tiene una API Plugin decente. Deberías escribir el complemento en Java implementando la interfaz IPlugin. La mayor parte de la magia está en la función 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 ... }

La mejor manera de comenzar a escribir un complemento es escribir primero la API de JavaScript. Normalmente, comenzaría escribiendo una clase personalizada de JavaScript y, en cada método de la clase javascript, ordenaría las variables y llamaría al complemento que desarrolló utilizando el método Phonegap.exec (). Aquí está la firma del método para su referencia.

/* 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)

También necesita registrar el complemento. Para ello, agregue el código de registro en la parte inferior de su biblioteca de JavaScript personalizada.

En el ejemplo siguiente, el autor definió una clase javascript BarcodeScanner y la registra utilizando el método addConstructor.

Dos pasos se llevan a cabo en el addConstructor:

  1. Cree una nueva instancia de BarcodeScanner en javascript y regístrela. Esto es accesible en javascript como window.plugins.barcodeScanner

  2. Registra la clase de complemento personalizada con un nombre de servicio. Este nombre de servicio se transfiere como primer argumento a PhoneGap.exec para que PhoneGap pueda instanciar la clase de complemento java y llamar al método execute ().

Código de registro de muestra:

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


Si alguien obtiene una excepción nullPointer utilizando el código anterior, haga super.oncreate () primero y luego super..init ()

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

Encontré esta solución aquí: Phonegap Google Group

Muchas gracias a @ zorglub76 por la solución ....


una forma más simple:

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


addJavaScriptInterface(mc, "MyCls") sin Gap init() ed puede causar aplastamiento de la aplicación, será mejor que agregue super.init() antes de 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)); } }