2010-04-28 15 views

Respuesta

125

Finalmente lo hice funcionar.

  • Crear una clase con métodos que desea utilizar:

    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 añadir una interfaz 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 ventana de llamada Javascript. Métodos de MyCls:

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

Nota:

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

+0

hmm, este ejemplo es grande, pero me da una excepción en NullPointer APPVIEW, parece ser nulo. ¿Dónde comienzas el objeto? – dan

+1

¡No funciona a menos que los métodos sean públicos! ¡gran trabajo! – dan

+1

sumando super.init(); al igual que @Karfield mencionado a continuación se corrigió la Excepción nullpointer para mí. –

9

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 escribiendo 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 debe registrar el complemento. Para ello, agregue el código de registro en la parte inferior de su biblioteca de JavaScript personalizada.

En el siguiente ejemplo, 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. crear una nueva instancia de BarcodeScanner en javascript y la registra. 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 pasa como primer argumento a PhoneGap.exec para que PhoneGap pueda instanciar la clase de complemento java y llamar al método execute() en él.

Muestra el código de registro:

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

¿Qué versión de phonegap, esta muestra es para? Creo que estás hablando por debajo de 2.0. ¿Derecha? –

14

addJavaScriptInterface(mc, "MyCls") sin Gap init() ed puede causar aglomeración de la aplicación, es mejor que añadir super.init() antes 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)); 
    } 
} 
+1

FYI, acabo de editar sus cambios en la respuesta de zorglub76. –

+1

Esta respuesta necesita una edición adecuada. ¿Nadie? – Rajkiran

5

Si alguien se NullPointer excepción usando el código de arriba, 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 para la solución ....

6

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

Comunicación de JavaScript para 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.

Description by here

Cuestiones relacionadas