2013-05-03 9 views
21

tôi có thể sử dụng chức năng java từ chức năng java script trên điện thoại và android 2.2 nhưng cùng một mã không chạy trên API 17. Tôi nên làm gì để gọi cho người bản xứ mã java trên từ kịch bản java trong API 17.appView.addJavascriptInterface() không hoạt động trên API 17

tôi sử dụng mã này trong file java của tôi

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

lớp CustomNativeAccess của tôi là

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

và trong kịch bản java của tôi sử dụng dòng này để gọi chức năng đăng nhập này

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

nên sử dụng này tôi gọi thành công này trên api 2.2 nhưng khi tôi chạy mã này vào api 17 nó cho tôi lỗi

lỗi chưa gặp: Object [đối tượng Object] không có phương pháp 'đăng nhập' tại file: ///android_asset/www/index.html: 81

làm thế nào tôi có thể sử dụng này trên api 17

Trả lời

38

gì bạn phải làm trên API 17 là chú thích phương pháp của bạn với @JavascriptInterface:

Public class CustomNativeAccess { 
    @JavascriptInterface 

và sau đó thoát khỏi phần nhà xây dựng:

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

Ngoài ra hãy chắc chắn bạn Nhập JavascriptInterface vào dự án của bạn:

import android.webkit.JavascriptInterface; 

Bạn có thể đọc thêm tại đây: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

Chỉnh sửa: Bạn sẽ phải chú thích từng phương thức với @JavascriptInterface trong lớp học mà bạn muốn truy cập từ Javascript.

+1

Người ta có thể sử dụng các nhà xây dựng mà không phải là một vấn đề. – gregory561

+1

không có probs với các nhà xây dựng, nhưng nó không cần thiết tại thời điểm đó và – benka

+0

Tôi có thể xác nhận rằng không có vấn đề với các nhà xây dựng. Các điều kiện là các phương thức phải có chú thích ** @ JavascriptInterface ** và được ** công khai **. – nacho4d

0

tôi chỉ viết những ứng dụng web với addJavascriptInterface với API 17, nó hoạt động tốt. Tôi không biết điều gì đã xảy ra với mã của bạn. Có lẽ bạn có thể thử những:

chắc chắn rằng bạn thêm: Second

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

, tại sao bạn sử dụng super.loadUrl, không appView để nạp html?

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

'appView.setJavaScriptEnabled' không tồn tại, phiên bản' PhoneGap' nào bạn đã sử dụng ?? tôi đang sử dụng phiên bản '2.9' –

+0

xin lỗi, có lỗi. nó phải là 'webSettings.setJavaScriptEnabled (true) .' Và tôi không bao giờ sử dụng PhoneGap. – buptcoder

4

Từ 4.2 tài liệu Android:

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.

Nguồn: Android WebView Doc (nhấn mạnh thêm)

0

Giải pháp:

  1. thấp hơn các android:targetSdkVersion trong file manifest đến 16.
  2. Thay đổi cấp api biên dịch thành 17 trong project.properties: target=android-17 và chú thích gọi lại phương pháp với @JavascriptInterface.