Android Java와 Phonegap Javascript 간의 통신?


81

(PhoneGap) Javascript에서 Java 메서드를 호출 할 수 있다고 생각합니다.

누구든지 그 방법을 알고 있습니까 ?? (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;
      }
    }
    
  • 기본 활동에서이 클래스에 대한 Javascript 인터페이스를 추가하십시오.

    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));
        }
    }
    
  • 자바 스크립트 호출 window.MyCls 메서드에서 :

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

노트 :

주석에서 언급했듯이 Android 버전 4.2 이상에서는 @JavascriptInterfaceHTML 페이지에서 액세스하려는 메소드에 추가 하십시오. 참조 .


흠,이 예제는 훌륭하지만 appView에서 nullpointer 예외가 발생합니다. null 인 것 같습니다. 개체를 어디에서 초기화합니까?
最白目

1
super.init (); 추가 아래에 언급 된 @Karfield처럼 나를 위해 nullpointer 예외를 수정했습니다.
Renato H.

8
잘 했어! 팁 : Java에서 Javascript로 다른 방식으로 통신하려면 다음을 사용하십시오. mGap.sendJavascript ( "window.myJavascriptFunction ( 'some parameter');");
aeldron

5
E / Web Console (2513) : Uncaught TypeError : Object [object Object]에 file : ///android_asset/www/loginfile.js : 142 window.Mycls.sendEmail ( "rea@gmail.com"에 'sendEmail'메서드가 없습니다. ); 이 라인에서 오류를 얻을 수
딥우 맨디에게

2
나는 안드로이드 4.2.2에 대해이 코드를 시도했지만 Deepu ie Uncaught TypeError : Object [object Object] has no method 'getTelephoneNumber'at file : ///android_asset/www/app.js : 142와 비슷한 문제에 직면했습니다. 디버그 후 나는 4.2.2 링크
Akshay

14

addJavaScriptInterface(mc, "MyCls")Gap init()ed가 없으면 앱이 으스러 질 수 있습니다. 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에는 괜찮은 플러그인 API가 있습니다. IPlugin 인터페이스를 구현하여 Java로 플러그인을 작성합니다. 대부분의 마법은 execute () 함수에 있습니다.

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

플러그인 작성을 시작하는 가장 좋은 방법은 먼저 javascript API를 작성하는 것입니다. 일반적으로 사용자 지정 자바 스크립트 클래스를 작성하고 자바 스크립트 클래스의 각 메서드에서 변수를 마샬링하고 Phonegap.exec () 메서드를 사용하여 개발 한 플러그인을 호출합니다. 다음은 참조를위한 메서드 서명입니다.

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

플러그인도 등록해야합니다. 사용자 지정 자바 스크립트 라이브러리 하단에 등록 코드를 추가하면됩니다.

아래 예제에서 작성자는 javascript BarcodeScanner 클래스를 정의하고 addConstructor 메서드를 사용하여 등록합니다.

addConstructor에서 두 단계가 수행됩니다.

  1. 자바 스크립트로 BarcodeScanner의 새 인스턴스를 만들고 등록합니다. 이것은 자바 스크립트에서 window.plugins.barcodeScanner로 액세스 할 수 있습니다.

  2. 사용자 정의 플러그인 클래스를 서비스 이름으로 등록합니다. 이 서비스 이름은 PhoneGap.exec에 대한 첫 번째 인수로 전달되므로 PhoneGap은 Java 플러그인 클래스를 인스턴스화하고 여기에서 execute () 메소드를 호출 할 수 있습니다.

샘플 등록 코드 :

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 이하에 대해 이야기하고 있다고 생각합니다. 권리?
Anas Azeem 2013 년

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

위의 코드를 사용하여 nullPointer 예외가 발생하면 super.oncreate ()를 먼저 수행 한 다음 super..init ()를 수행하십시오.

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

여기에서이 해결책을 찾았습니다. Phonegap Google Group

솔루션을 위해 @ zorglub76에게 감사드립니다 ....


0

자바 스크립트에서 네이티브로의 통신은 Android 네이티브 코드에서 자바 스크립트 프롬프트 기능을 재정 의하여 이루어지며 전달 된 메시지는 iOS에서 사용되는 것과 매우 유사합니다. WebView.addJavascriptInterface를 사용하여 Java 개체를 JavaScript 샌드 박스에 직접 추가했지만 이로 인해 일부 장치가 Android 2.3과 충돌했습니다. 네이티브에서 JavaScript를 호출하기 위해 현재 WebView.loadUrl (”javascript :…”)을 사용하지만 몇 가지 문제가 있으므로 곧 장기 XHR 연결을 통해 로컬 HTTP 서버를 호출하는 Java 메시지 큐를 폴링하는 것으로 넘어갑니다.

여기까지 설명

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.