De communicatie tussen de Android en Java Phonegap Javascript?

Ik geloof dat het mogelijk is om te bellen Java-methoden van (PhoneGap) Javascript.

Iemand weet hoe dat te doen?? (Ik weet hoe dat te doen door het veranderen van de bron code van PhoneGap, maar ik wil voorkomen dat)

InformationsquelleAutor zorglub76 | 2010-04-28

 

6 Replies
  1. 125

    Ik eindelijk het werk.

    • Maak een klasse met methoden die u wilt gebruiken:

      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 uw belangrijkste activiteit toevoegen van een Javascript-interface voor deze klasse:

      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 Javascript gespreksvenster.MyCls methoden:

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

    Opmerking:

    Zoals vermeld in de reactie een Android-versie 4.2 en hoger, voeg @JavascriptInterface te maken met de methode die u wilt openen vanuit uw HTML-pagina. Verwijzing.

    • hmm, dit voorbeeld is geweldig, maar ik krijg een nullpointer Uitzondering op appView, het lijkt null. Waar wil je intialise het object?
    • Het werkt niet tenzij de methoden zijn openbaar! geweldig werk!
    • toevoegen super.init(); zoals @Karfield vermeld hieronder vast de nullpointer Uitzondering voor mij.
    • Voor degenen onder ons die gebruik maken van PhoneGap zonder iets te weten over java… Waar precies moet ik dat public class MyClass?
    • Ik zou een nieuw pakket maakt iets zoals ‘com.myapp.utils’Then maken van de klasse er, echt het maakt niet uit eclipse is erg goed in het importeren van klassen voor u (Ctrl + Shift + O importeren ontbrekende klassen)
    • U rock! Hielp me om een probleem te verhelpen heb ik gewerkt aan de laatste 10 uur.
    • Geweldig werk! Tip: als u wilt communiceren met de andere ronde van Java en Javascript), gebruik maken van deze: mGap.sendJavascript(“venster.myJavascriptFunction(‘sommige parameter’);”);
    • hi. Hoe doe je het omgekeerde van deze ie bellen met een JS-functie van native code?
    • E/Web Console(2513): Onbekende TypeError: Object [object object] heeft geen methode sendEmail’ in bestand:///android_asset/www/loginfile.js:142 venster.Mycls.sendEmail(“[email protected]”); Fout op deze lijn
    • heel erg bedankt maatje. u rock het is erg goed voor mij thsnks
    • Houdt u mij helpen met dit. Ik wil een uitvoering van de sendJavascript() stackoverflow.com/questions/19558535/…. Plz HELP me te implementeren.
    • Ik heb geprobeerd deze code voor android 4.2.2, ik werd geconfronteerd met een probleem gewoon vergelijkbaar met Deepu d.w.z. Onbekende TypeError: Object [object object] heeft geen methode getTelephoneNumber’ in bestand:///android_asset/www/app.js:142 .Na een aantal debug ik vond dat je nodig hebt om toe te voegen @JavascriptInterface voor toegang tot de enige methode die u wilt openen in javascript op bovenstaande 4.2.2 link

  2. 14

    addJavaScriptInterface(mc, "MyCls") zonder Gat init()ed kan leiden tot verbrijzeling van de app, kunt u beter toevoegen super.init() voordat 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));
       }
    }
    • FYI, ik heb zojuist hebt bewerkt, worden uw wijzigingen in zorglub76 ‘ s antwoord.
    • Dit antwoord moet een juiste bewerken. Iemand?
  3. 9

    PhoneGap heeft een goede Plugin API. Je zou het schrijven van de plug-in Java door de implementatie van de interface IPlugin. De meeste van de magie is in de execute () – functie.

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

    De beste manier om te beginnen met het schrijven van een plugin is door het schrijven van de javascript-API eerste. Je zou typisch beginnen met het schrijven van een aangepaste javascript-klasse, en in elke methode op de javascript-klasse, de maarschalk van de variabelen en de oproep in de plugin ontwikkeld met behulp van de Phonegap.exec() methode. Hier is de handtekening van de methode voor uw referentie.

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

    U ook nodig voor het registreren van de Plugin. U kunt dit doen door het toevoegen van de code aan de onderkant van uw aangepaste javascript-bibliotheek.

    In het voorbeeld hieronder, de auteur gedefinieerde een javascript BarcodeScanner klasse en registreert het gebruik van de addConstructor methode.

    Twee stappen zijn uitgevoerd in de addConstructor:

    1. Maken van een nieuw exemplaar van de BarcodeScanner in javascript en registreert.
      Dit is te bereiken in javascript als venster.plugins.barcodeScanner

    2. Registreert de aangepaste Invoegtoepassing klasse met een naam van de service. Deze service naam
      is doorgegeven als het eerste argument naar PhoneGap.exec dus dat PhoneGap
      kan het concretiseren van de java-plug-klasse en de oproep execute() methode op.

    Steekproef registratie code:

    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");
    });
    • Welke versie van phonegap, dit voorbeeld is het voor? Ik denk dat je het over onder de 2.0. Rechts?
  4. 6

    een eenvoudiger vorm:

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

    Als iedereen krijgt nullPointer uitzondering behulp van de bovenstaande code doet het super.oncreate() en vervolgens super..init()

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

    Ik vond deze oplossing is hier: Phonegap Google-Groep

    Heel veel dank aan @zorglub76 voor de oplossing…….

  6. 0

    Mededeling van JavaScript native-wordt bereikt door het overschrijven van de JavaScript-prompt-functie in de Android native code en het bericht doorgegeven wordt veel zoals dat wordt gebruikt in iOS. We gebruiken WebView.addJavascriptInterface toevoegen Java-objecten rechtstreeks aan de JavaScript-sandbox, maar dat de oorzaak was van sommige apparaten crash met Android 2.3. Om JavaScript aanroepen van native wij gebruiken momenteel WebView.loadUrl(“javascript:…”), maar dat heeft een aantal problemen, dus we zijn al snel aan het verplaatsen naar de meningen van een Java message queue bellen van een lokale HTTP-server via een lange levensduur XHR verbinding.

    Beschrijving door hier te klikken

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *