2013-09-04 17 views

Odpowiedz

11

Możesz utworzyć niestandardową wtyczkę, aby wywołać dowolną metodę z natywnej strony. Utworzyć oddzielny plik JavaScript, powiedzmy customplugin.js i umieścić to do niego:

var CustomPlugin = {}; 

CustomPlugin.callNativeMethod = function() { 
    cordova.exec(null, null, "CustomPlugin", "callNativeMethod", []); 
}; 

Teraz na rodzimej strony Java, należy utworzyć nową klasę i nazwij go CustomPlugin.java, następnie dodać to:

package com.yourpackage; 

import org.apache.cordova.CordovaWebView; 
import org.apache.cordova.api.CallbackContext; 
import org.apache.cordova.api.CordovaInterface; 
import org.apache.cordova.api.CordovaPlugin; 

import com.yourpackage.MainActivity; 

public class CustomPlugin extends CordovaPlugin 
{ 
    private static final String TAG = "CustomPlugin"; 

    private CallbackContext callbackContext = null; 
    private MainActivity activity = null; 

    /** 
    * Override the plugin initialise method and set the Activity as an 
    * instance variable. 
    */ 
    @Override 
    public void initialize(CordovaInterface cordova, CordovaWebView webView) 
    { 
     super.initialize(cordova, webView); 

     // Set the Activity. 
     this.activity = (MainActivity) cordova.getActivity(); 
    } 

    /** 
    * Here you can delegate any JavaScript methods. The "action" argument will contain the 
    * name of the delegated method and the "args" will contain any arguments passed from the 
    * JavaScript method. 
    */ 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException 
    { 
     this.callbackContext = callbackContext; 

     Log.d(TAG, callbackContext.getCallbackId() + ": " + action); 

     if (action.equals("callNativeMethod")) 
     { 
      this.callNativeMethod(); 
     } 
     else 
     { 
      return false; 
     } 

     return true; 
    } 

    private void callNativeMethod() 
    { 
     // Here we simply call the method from the Activity. 
     this.activity.callActivityMethod(); 
    } 
} 

Upewnij się zmapować wtyczek w pliku config.xml dodając ten wiersz:

... 
<feature name="CustomPlugin"> 
    <param name="android-package" value="com.yourpackage.CustomPlugin" /> 
</feature> 
... 

teraz, aby zadzwonić do wtyczki z index.html można po prostu zadzwonić do metody JavaScript:

CustomPlugin.callNativeMethod(); 

Za pomocą tej metody można wygodnie skonfigurować wiele niestandardowych metod. Aby uzyskać więcej informacji, zapoznaj się z przewodnikiem rozwoju wtyczki PhoneGap here.

+0

Dzięki @suprnova swoje Odpowiedź jest pomocna, może działa dla poprzedniej wersji, ale zauważam, że używam ostatniej wersji phonegapa (3.0) i zakodowałem to, ale nie działa. Mam ten błąd wywołania exec() do nieznanej wtyczki, znalazłem coś podobnego tutaj http://stackoverflow.com/questions/17974301/phonegap-3-plugin-exec-call-to-unknown-plugin – nramirez

+1

Masz rację, to nie zadziała z PhoneGap 3.0, ale myślę, że dzieje się tak dlatego, że mapowanie wtyczek, którego użyłem w poprzedniej odpowiedzi, jest przestarzałe. Jednak zaktualizowałem swoją odpowiedź za pomocą mapowania PhoneGap 3.0. Zasadniczo, element '' w pliku config.xml jest przestarzały, należy zamiast tego użyć elementu ''. – kieranroneill

+0

Tak! Już się za to zabieram! Jak tylko dostanę rozwiązanie tego pytania, opublikuję odpowiedź! – nramirez

2

Po zakończeniu wszystko z powyższej odpowiedzi, będzie trzeba także dodać wtyczkę w res/xml/config.xml, aby to działało

<plugin name="PluginName" value="com.namespace.PluginName"/> 

przed znacznikiem </plugins>