Подтвердить что ты не робот

AppView.addJavascriptInterface() не работает с API 17

Я могу использовать java-функцию из функции java script java phonegap phone и Android 2.2. но тот же код не запускается на API 17. что мне нужно сделать, чтобы вызвать собственный код Java из java script в 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 script я использую эту строку для вызова этой функции входа

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

поэтому, используя это, я успешно вызываю это на api 2.2, но когда я запускаю этот код на api 17, он дает мне ошибку

Uncaught TypeError: Object [object Object] не имеет метода "login" в файле:///android_asset/www/index.html: 81

как я могу это использовать на api 17

4b9b3361

Ответ 1

Что вы должны сделать в 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.

Ответ 2

Из документации Android 4.2:

Внимание: если вы установили цель targetSdkVersion на 17 или выше, вы должны добавьте аннотацию @JavascriptInterface к любому методу, который вы хотите доступный код вашей веб-страницы (метод должен быть общедоступным). если ты не предоставляют аннотации, то метод не будет доступен вашей веб-страницы при работе на Android 4.2 или новее.

Источник: Android WebView Doc (выделено мной)

Ответ 3

Я только что написал веб-приложение с addJavascriptInterface с API 17, он работает хорошо. Я не знаю, что случилось с вашим кодом. Возможно, вы можете попробовать:

убедитесь, что вы добавили:

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

Ответ 4

Решения:

  • Опустите android:targetSdkVersion в файле манифеста до 16.
  • Измените уровень api-компиляции на 17 в project.properties: target=android-17 и аннотируйте метод обратного вызова с помощью @JavascriptInterface.