Android जावा और फोनगैप जावास्क्रिप्ट के बीच संचार?


81

मेरा मानना ​​है कि जावास्क्रिप्ट (फोनगैप) जावास्क्रिप्ट से कॉल करना संभव है।

किसी को पता है कि कैसे करना है ?? (मुझे पता है कि PhoneGap के स्रोत कोड को बदलकर इसे कैसे करना है, लेकिन मैं इससे बचूंगा)

जवाबों:


125

मैंने आखिरकार यह काम किया।

  • उन विधियों के साथ एक कक्षा बनाएँ जिनका आप उपयोग करना चाहते हैं:

    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;
      }
    }
    
  • अपनी मुख्य गतिविधि में इस वर्ग के लिए एक जावास्क्रिप्ट इंटरफ़ेस जोड़ें:

    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));
        }
    }
    
  • जावास्क्रिप्ट कॉल विंडो में। मेरे तरीके:

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

ध्यान दें:

जैसा कि टिप्पणी में उल्लेख किया गया है, एंड्रॉइड संस्करण 4.2 और इसके बाद के संस्करण के लिए, @JavascriptInterfaceउस विधि में जोड़ें जिसे आप अपने HTML पृष्ठ से एक्सेस करना चाहते हैं। संदर्भ


हम्म, यह उदाहरण बहुत अच्छा है, लेकिन मुझे ऐप व्यू पर एक नलपॉइंट एक्सेप्शन मिलता है, ऐसा लगता है कि यह अशक्त है। आप वस्तु को कहां रखते हैं?
39 目

1
super.init () जोड़ना; जैसे @Karfield ने नीचे उल्लेख किया है मेरे लिए nullpointer अपवाद तय किया है।
रेनैटो एच।

8
अच्छा काम! युक्ति: यदि आप दूसरे तरीके के राउंड (जावा से जावास्क्रिप्ट तक) को संवाद करना चाहते हैं, तो इसका उपयोग करें: mGap.sendJavascript ("window.myJavascriptFunction ('कुछ पैरामीटर');");
एल्ड्रॉन

5
ई / वेब कंसोल (2513): अनकैप्ड टाइपर: ऑब्जेक्ट [ऑब्जेक्ट ऑब्जेक्ट] का कोई तरीका 'sendEmail' फाइल में नहीं है: ///android_asset/www/loginfile.js: 142 window.Mycls.endEmail ("rea@gmail.com") ); इस लाइन पर त्रुटि प्राप्त करें
दीपू मैंडी

2
मैंने इस कोड को एंड्रॉइड 4.2.2 के लिए आज़माया है, मुझे दीपू यानी अनकैप्ड टाइपर: ऑब्जेक्ट [ऑब्जेक्ट ऑब्जेक्ट] के समान ही एक समस्या का सामना करना पड़ा है फ़ाइल में कोई तरीका 'getTelephoneNumber' नहीं है: ///android_asset/www.app.js: 142। कुछ डिबग के बाद मैंने पाया कि आपको किसी भी विधि के लिए @JavascriptInterface को जोड़ने की आवश्यकता है, जिसे आप 4.2.2 लिंक के
अक्षय

14

addJavaScriptInterface(mc, "MyCls")बिना गैप init()एड के ऐप के क्रश हो सकते हैं, आप super.init()पहले बेहतर तरीके से जोड़ेंगे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));
   }
}

9

PhoneGap में एक सभ्य प्लगइन एपीआई है। आप IPlugin इंटरफ़ेस को लागू करके जावा में प्लगइन लिखेंगे। अधिकांश जादू निष्पादन () फ़ंक्शन में है।

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

सबसे अच्छा तरीका है एक प्लगइन लिखना शुरू करने के लिए पहले जावास्क्रिप्ट एपीआई लिखकर। आप एक कस्टम जावास्क्रिप्ट क्लास लिखकर विशिष्ट शुरुआत करेंगे, और जावास्क्रिप्ट क्लास पर प्रत्येक विधि में, चर को मर्सल करें और उस प्लग इन में कॉल करें, जिसे आपने फोनगैप.इएक्सईसी () विधि का उपयोग करके विकसित किया था। यहाँ आपके संदर्भ के लिए विधि हस्ताक्षर है।

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

आपको प्लगइन रजिस्टर करने की भी आवश्यकता है। आप अपने कस्टम जावास्क्रिप्ट लाइब्रेरी के नीचे पंजीकरण कोड जोड़कर ऐसा करते हैं।

नीचे दिए गए उदाहरण में, लेखक ने एक जावास्क्रिप्ट BarcodeScanner वर्ग को परिभाषित किया और इसे AddConstructor विधि का उपयोग करके पंजीकृत किया।

AddConstructor में दो चरण किए जाते हैं:

  1. जावास्क्रिप्ट में BarcodeScanner का एक नया उदाहरण बनाएं और इसे पंजीकृत करें। यह जावास्क्रिप्ट में window.plugins.barcodeScanner के रूप में उपलब्ध है

  2. कस्टम प्लगिन वर्ग को सेवा नाम के साथ पंजीकृत करता है। इस सेवा का नाम PhoneGap.exec के पहले तर्क के रूप में दिया गया है ताकि PhoneGap java plugin class को तुरंत हटा सके और उस पर निष्पादित () विधि को कॉल कर सके।

नमूना पंजीकरण कोड:

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

Phonegap का कौन सा संस्करण है, यह नमूना किसके लिए है? मुझे लगता है कि आप नीचे 2.0 के बारे में बात कर रहे हैं। सही?
अनस अज़ीम

6

एक सरल रूप:

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

यदि किसी को उपरोक्त कोड का उपयोग करने के लिए अशक्त अपवाद मिलता है, तो super.oncreate () पहले और फिर super..init () करें

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

मुझे यह समाधान यहां मिला: फोनगप Google समूह

समाधान के लिए @ zorglub76 को बहुत-बहुत धन्यवाद ...।


0

Android देशी कोड में जावास्क्रिप्ट प्रॉम्प्ट फ़ंक्शन को ओवरराइड करके जावास्क्रिप्ट से मूल निवासी के लिए संचार प्राप्त किया जाता है और पारित संदेश iOS में उपयोग किए जाने के समान है। हम जावा ऑब्जेक्ट को सीधे जावास्क्रिप्ट सैंडबॉक्स में जोड़ने के लिए WebView.addJavascriptInterface का उपयोग करते थे लेकिन इससे कुछ डिवाइस एंड्रॉइड 2.3 के साथ क्रैश हो रहे थे। जावास्क्रिप्ट को मूल से कॉल करने के लिए हम वर्तमान में WebView.loadUrl ("जावास्क्रिप्ट: ...") का उपयोग करते हैं, लेकिन इसमें कुछ समस्याएं हैं, इसलिए हम जल्द ही एक लंबे समय तक रहने वाले XHR कनेक्शन के माध्यम से एक स्थानीय HTTP सर्वर को कॉल करने वाले जावा संदेश कतार में मतदान करने के लिए आगे बढ़ रहे हैं।

विवरण यहाँ से

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.