2013-05-03 111 views
21

我能夠使用我的phonegap java腳本函數和android 2.2 中的java函數,但是相同的代碼不在API 17上運行。我應該怎麼做才能調用native從Java的Java腳本API中對代碼17appView.addJavascriptInterface()不適用於API 17

我在Java文件中使用此代碼

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

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

和在我的Java腳本我使用此行來調用這個登錄功能

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

,因此使用此我成功地把這種對API的2.2,但是當我運行API 17這段代碼把它給我錯誤

遺漏的類型錯誤:對象的翻譯:有沒有方法「登錄」的文件:///android_asset/www/index.html:81

我如何我使用這個API上17

回答

38

你有什麼對API 17要做的就是用@JavascriptInterface註解你的方法:

Public class CustomNativeAccess { 
    @JavascriptInterface 

,然後擺脫構造部分:

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

還要確保你在您的項目中導入JavascriptInterface:

import android.webkit.JavascriptInterface; 

您可以在這裏更多的瞭解它: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

編輯:你必須標註每一個方法與你的類中@JavascriptInterface,你想從JavaScript訪問。

+1

可以使用不是問題的構造函數。 – gregory561 2013-08-07 12:47:07

+1

no probs與構造函數,但它沒有必要在這一點, – benka 2013-10-30 14:15:49

+0

我可以證實,構造函數沒有問題。條件是方法必須有註解** @ JavascriptInterface **並且是** public **。 – nacho4d 2016-06-22 07:04:35

0

我剛寫的Web應用程序與使用API​​ 17的addJavascriptInterface,它運行良好。我不知道你的代碼發生了什麼。也許你可以試試這些:

確保你添加:

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

二,爲什麼要使用super.loadUrl,不APPVIEW加載HTML?

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

'appView.setJavaScriptEnabled' does not exist,which'PhoneGap version' did you used ???我正在使用版本'2.9' – 2014-02-16 08:18:36

+0

對不起,有一個錯誤。它應該是'webSettings.setJavaScriptEnabled(true).'我從不使用PhoneGap。 – buptcoder 2014-02-17 10:58:19

4

從Android 4.2的文檔:

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.

來源:機器人的WebView文件(強調)

0

解決方案:

  1. 下在清單文件中的android:targetSdkVersion至16
  2. 在project.properties中將編譯api級別更改爲17:target=android-17並註釋回調方法與@JavascriptInterface
相關問題