2010-04-28 14 views

Antwort

125

Ich habe es endlich geschafft.

  • Erstellen Sie eine Klasse mit Methoden, die Sie verwenden möchten:

    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; 
        } 
    } 
    
  • In Ihrer Haupttätigkeit eine Javascript-Schnittstelle für diese Klasse hinzufügen:

    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)); 
        } 
    } 
    
  • In Anruffenster Javascript. MyCls-Methoden:

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

Hinweis:

Wie im Kommentar erwähnt, für Android-Version 4.2 und höher, fügen @JavascriptInterface der Methode, die Sie von Ihrer HTML-Seite zugreifen möchten. Reference.

+0

hmm, dieses Beispiel ist toll, aber ich erhalte eine Nullpointer-Ausnahme auf AppView, so scheint es null zu sein. Wo initialisierst du das Objekt? – dan

+1

Es funktioniert nicht, es sei denn, die Methoden sind öffentlich! gut gemacht! – dan

+1

hinzufügen super.init(); Wie @Karfield unten erwähnt hat die Nullpointer Exception für mich behoben. –

9

PhoneGap hat eine anständige Plugin API. Sie würden das Plugin in Java schreiben, indem Sie die IPlugin-Schnittstelle implementieren. Der Großteil der Magie liegt in der Funktion execute().

Der beste Weg, um mit dem Schreiben eines Plugins zu beginnen, ist das Schreiben der JavaScript-API zuerst. Sie würden normalerweise mit dem Schreiben einer benutzerdefinierten JavaScript-Klasse beginnen und in jeder Methode der JavaScript-Klasse die Variablen marshalieren und in das von Ihnen entwickelte Plug-in mit der Phonegap.exec() -Methode aufrufen. Hier ist die Methodensignatur für Ihre Referenz.

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

Sie müssen auch das Plugin registrieren. Dazu fügen Sie den Registrierungscode am Ende Ihrer benutzerdefinierten JavaScript-Bibliothek hinzu.

Im folgenden Beispiel definierte der Autor eine JavaScript BarcodeScanner-Klasse und registrierte sie mit der addConstructor-Methode.

Zwei Schritte werden in dem addConstructor durchgeführt:

  1. eine neue Instanz von Barcodescanner in Javascript erstellen und registriert sie. Dies ist in JavaScript als window.plugins.barcodeScanner verfügbar.

  2. Registriert die benutzerdefinierte Plugin-Klasse mit einem Dienstnamen. Dieser Servicename wird als erstes Argument an PhoneGap.exec übergeben, so dass PhoneGap die Java-Plugin-Klasse instanziieren und die execute() -Methode darauf aufrufen kann.

Beispielregistrierungscode:

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

Für welche Version von phonegap ist dieses Beispiel gedacht? Ich denke du sprichst unter 2.0. Recht? –

14

addJavaScriptInterface(mc, "MyCls") ohne Gap init() ed kann Crush der App verursachen, sollten Sie besser super.init() vor 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, ich habe gerade Ihre Änderungen in die Antwort von zorglub76 geändert. –

+1

Diese Antwort benötigt eine ordnungsgemäße Bearbeitung. Jemand? – Rajkiran

5

hinzufügen Wenn jemand Nullpointer Ausnahme bekommt Benutze den obigen Code, mach zuerst super.oncreate() und dann super..init()

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

ich diese Lösung hier gefunden: Phonegap Google Group

Vielen Dank an @ zorglub76 für die Lösung ....

6

eine einfachere Form:

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

Mitteilung JavaScript nativen Dies wird erreicht, indem die JavaScript-Eingabeaufforderung im nativen Android-Code überschrieben wird und die übermittelte Nachricht weitgehend der in iOS verwendeten entspricht. Wir verwendeten WebView.addJavascriptInterface, um Java-Objekte direkt zur JavaScript-Sandbox hinzuzufügen, was jedoch dazu führte, dass einige Geräte mit Android 2.3 abstürzten. Um JavaScript von nativ aufzurufen, verwenden wir derzeit WebView.loadUrl ("javascript: ..."), aber das hat einige Probleme, weshalb wir bald eine Java-Nachrichtenwarteschlange aufrufen, die über eine langlebige XHR-Verbindung einen lokalen HTTP-Server aufruft.

Description by here

Verwandte Themen