Android Java ve Phonegap Javascript arasındaki iletişim?


81

Java yöntemlerini (PhoneGap) Javascript'ten çağırmanın mümkün olduğuna inanıyorum.

Bunu nasıl yapacağını bilen var mı? (PhoneGap'in kaynak kodunu değiştirerek bunu nasıl yapacağımı biliyorum ama bundan kaçınırım)

Yanıtlar:


125

Sonunda çalıştırdım.

  • Kullanmak istediğiniz yöntemlerle bir sınıf oluşturun:

    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;
      }
    }
    
  • Ana etkinliğinizde bu sınıf için bir Javascript arayüzü ekleyin:

    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));
        }
    }
    
  • Javascript çağrı penceresinde. MyCls yöntemleri:

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

Not:

Yorumda belirtildiği gibi, Android 4.2 ve üzeri sürümler @JavascriptInterfaceiçin HTML sayfanızdan erişmek istediğiniz yöntemi ekleyin . Referans .


hmm, bu örnek harika, ancak appView'da nullpointer İstisnası alıyorum, boş görünüyor. Nesneyi nereye yönlendiriyorsunuz?
最 白 目

1
super.init () ekleniyor; Aşağıda belirtilen @Karfield gibi, benim için nullpointer İstisnasını düzeltti.
Renato H.

8
İyi iş! İpucu: Diğer yoldan (Java'dan Javascript'e) iletişim kurmak istiyorsanız, şunu kullanın: mGap.sendJavascript ("window.myJavascriptFunction ('bir parametre');");
aeldron

5
E / Web Konsolu (2513): Yakalanmamış TypeError: Nesne [nesne Nesnesi], file: ///android_asset/www/loginfile.js: 142 window.Mycls.sendEmail ("rea@gmail.com" adresinde 'sendEmail' yöntemine sahip değildir ); Bu satırda hata al
Deepu Mandy

2
Android 4.2.2 için bu kodu denedim, Deepu'ya benzer bir sorunla karşılaştım, yani Yakalanmamış TypeError: Object [object Object] file: ///android_asset/www/app.js: 142 adresinde 'getTelephoneNumber' yöntemine sahip değil. Bazı hata ayıklamadan sonra, javascript'te erişmek istediğiniz herhangi bir yönteme erişmek için @JavascriptInterface eklemeniz gerektiğini fark ettim, yukarıdaki 4.2.2 bağlantısında
Akshay

14

addJavaScriptInterface(mc, "MyCls")Gap init()ed olmadan uygulamanın ezilmesine neden olabilir, daha super.init()önce eklemelisinizaddJavascriptInterface()

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

9

PhoneGap, iyi bir Eklenti API'sine sahiptir. Eklentiyi, IPlugin arayüzünü uygulayarak Java ile yazarsınız. Sihrin çoğu execute () işlevindedir.

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

Bir eklenti yazmaya başlamanın en iyi yolu, önce javascript API'sini yazmaktır. Tipik olarak özel bir javascript sınıfı yazarak başlarsınız ve javascript sınıfındaki her yöntemde, değişkenleri sıralayın ve Phonegap.exec () yöntemini kullanarak geliştirdiğiniz eklentiyi çağırın. İşte referansınız için yöntem imzası.

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

Eklentiyi de kaydetmeniz gerekir. Bunu, özel javascript kitaplığınızın altına kayıt kodunu ekleyerek yaparsınız.

Aşağıdaki örnekte, yazar bir javascript BarcodeScanner sınıfı tanımladı ve addConstructor yöntemini kullanarak bunu kaydeder.

AddConstructor'da iki adım gerçekleştirilir:

  1. JavaScript'te yeni bir BarcodeScanner örneği oluşturun ve bunu kaydeder. Buna javascript'te window.plugins.barcodeScanner olarak erişilebilir.

  2. Özel Plugin sınıfını bir hizmet adıyla kaydeder. Bu hizmet adı PhoneGap.exec'e ilk argüman olarak aktarılır, böylece PhoneGap java eklenti sınıfını başlatabilir ve üzerinde execute () yöntemini çağırabilir.

Örnek kayıt kodu:

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

Bu örnek phonegap'in hangi sürümü için? Sanırım 2.0'ın altından bahsediyorsunuz. Sağ?
Anas Azeem

6

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

5

Yukarıdaki kodu kullanan herhangi biri nullPointer istisnası alırsa, önce super.oncreate () ve ardından super..init () yapın

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

Bu çözümü burada buldum: Phonegap Google Grubu

Çözüm için @ zorglub76'ya çok teşekkürler ....


0

JavaScript'ten yerele iletişim, Android yerel kodundaki JavaScript komut istemi işlevinin geçersiz kılınmasıyla sağlanır ve iletilen mesaj iOS'ta kullanılana çok benzer. Java nesnelerini doğrudan JavaScript sanal alanına eklemek için WebView.addJavascriptInterface'i kullanırdık, ancak bu, bazı cihazların Android 2.3 ile çökmesine neden oluyordu. Yerelden JavaScript'i çağırmak için şu anda WebView.loadUrl (”javascript:…”) ​​kullanıyoruz, ancak bu bazı sorunları var, bu nedenle kısa süre sonra uzun ömürlü bir XHR bağlantısı aracılığıyla yerel bir HTTP sunucusunu çağıran bir Java mesaj kuyruğunu sorgulamaya geçeceğiz.

Buraya göre açıklama

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.