Android 4.2.1, разрывы интерфейса WebView и JavaScript

У меня есть веб-просмотр с добавленным интерфейсом javascript, который отлично работает на большинстве устройств, кроме тех, которые работают под управлением Android 4.2.1.

Я удалил большую часть кода и остался с очень простым кодом:

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
    public void handshake() {
        Log.d("JS", "handshake no params");
    }

    public void handshake(String json) {
        Log.d("JS", "handshake with params: " + json);
    }
}, "Android");

С точки зрения javascript тестовый код выглядит так:

Android.handshake();

Но я получаю это в logcat:

E / Web Console: Uncaught TypeError: Object [object Object] не имеет метода "рукопожатие"

Опять же, эта та же самая вещь прекрасно работает на устройствах, которые имеют более старую ОС Android (< 4.2.1), которую я протестировал (минимальная версия 2.3.3).

Странно то, что если я запускаю совершенно новый проект, в котором нет ничего, кроме одного Activity, в котором есть только WebView, с тем же кодом, то все прекрасно работает даже для 4.2.1, но когда это часть моего реального проекта, вещи ломаются, Я ничего не делаю с веб-представлением, которое не включено в предоставленные мной фрагменты кода.

Что самое странное для меня, это то, что javascript находит объект Android, но у него просто нет запрошенного метода (рукопожатия), как это может быть?

Любая помощь будет принята с благодарностью, так как это сводит меня с ума в течение последних 2 недель или около того (это ошибка, к которой я все время возвращаюсь, потом сдаюсь и т. Д.). Благодарю.

2 ответа

Решение

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

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

Вы должны аннотировать (@JavascriptInterface) методы в классе Java, которые вы хотите сделать доступными для JavaScript.

    public class JavaScriptInterface {
Context context;


JavaScriptInterface(Context c) {
    context = c;
}

@JavascriptInterface
public void edit(String postid) {
    Log.d("myApp", "EDIT!");
    //do stuff
}    }

Это сработало для меня. Попробуйте это.

Другие вопросы по тегам