2013-05-03 18 views
21

sono in grado di utilizzare la funzione java dalla mia funzione di script java phonegap e Android 2.2 ma lo stesso codice non viene eseguito su API 17. Cosa devo fare per chiamare nativo codice Java sul da java script in API 17.appView.addJavascriptInterface() non funziona su API 17

ho utilizzare questo codice nel mio file java

objCustomNativeAccess = new CustomNativeAccess(this, appView); 
      appView.addJavascriptInterface(objCustomNativeAccess, 
        "CustomNativeAccess"); 
    super.loadUrl("file:///android_asset/www/index.html"); 

mia classe CustomNativeAccess è

public class CustomNativeAccess { 
     private WebView mAppView; 
     private DroidGap mGap; 

     /** 
     * Constructor 
     * 
     * @param gap 
     * @param view 
     */ 
     public CustomNativeAccess(DroidGap gap, WebView view) { 
      mAppView = view; 
      mGap = gap; 
     } 

     /** 
     * Get the device phone number 
     * 
     * @return 
     */ 
     public JSONObject login(String email, String password) { 
      JSONObject object = new JSONObject(); 
        object.put("Login_Status", login_status); 
      object.put("date", dateString); 
      return object; 
     } 

e nel mio script java io uso questa linea per chiamare questa funzione di login

var value = window.CustomNativeAccess.login(email,pass); 

in modo da utilizzare questo io chiamo con successo questo su API 2.2, ma quando ho eseguito questo codice su api 17 che mi danno errore

TypeError Uncaught: Object [object Object] non ha un metodo 'login' al di file: ///android_asset/www/index.html: 81

come posso io uso questo su api 17

risposta

38

Quello che devi fare sul API 17 è annotare il metodo con @JavascriptInterface:

Public class CustomNativeAccess { 
    @JavascriptInterface 

e poi sbarazzarsi della parte del costruttore:

/*private WebView mAppView; 
    private DroidGap mGap; 
    public CustomNativeAccess(DroidGap gap, WebView view) { 
     mAppView = view; 
     mGap = gap; 
    } 
*/ 

Anche essere sicuri di import JavascriptInterface nel tuo progetto:

import android.webkit.JavascriptInterface; 

Si può leggere su più qui: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

Edit: Si dovrà annotare ogni metodo con @JavascriptInterface all'interno della vostra classe che si desideri accedere da JavaScript.

+1

Uno può usare costruttori che non è un problema. – gregory561

+1

no prob con i costruttori, ma non è necessario a quel punto e – benka

+0

Posso confermare che non vi è alcun problema con il costruttore. Le condizioni sono i metodi devono avere l'annotazione ** @ JavascriptInterface ** ed essere ** public **. – nacho4d

0

ho appena scritto l'applicazione web con addJavascriptInterface con API 17, funziona bene. Non so cosa sia successo al tuo codice. Forse si può provare questi:

assicurarsi di aggiungere il:

WebSettings webSettings = appView.getSettings(); 
webSettings.setJavaScriptEnabled(true); 

In secondo luogo, il motivo per cui si usa super.loadUrl, non APPVIEW per caricare il codice html?

objCustomNativeAccess = new CustomNativeAccess(this, appView); 
appView.addJavascriptInterface(objCustomNativeAccess, "CustomNativeAccess"); 
appView.loadUrl("file:///android_asset/www/index.html"); 
+0

'appView.setJavaScriptEnabled' non esiste, quale' versione PhoneGap' hai usato ?? sto usando la versione '2.9' –

+0

scusa, c'è un errore. dovrebbe essere 'webSettings.setJavaScriptEnabled (true) .' E non uso mai PhoneGap. – buptcoder

4

Dal Android 4.2 documentazione:

Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.

Fonte: Android WebView Doc (enfasi aggiunta)

0

Solutions:

  1. Abbassare il android:targetSdkVersion nel file manifesto a 16.
  2. Modificare il livello API di compilazione su 17 in project.properties: target=android-17 e annotare la richiamata metodo con @JavascriptInterface.
Problemi correlati