Различия в интерфейсах 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/Веб-консоль: Неподготовлено TypeError: Object [object Object] не имеет метод "рукопожатие"
Опять же, эта же самая точная вещь прекрасно работает в устройствах, у которых есть старые Android-версии os (< 4.2.1), которые я тестировал (минимальная версия 2.3.3).
Странно то, что если я начну совершенно новый проект, имея только одно действие, имеющее только WebView, с тем же кодом, все работает отлично даже для 4.2.1, но когда это часть моего фактического проекта, все ломается.
Я ничего не делаю с веб-просмотром, который не включен в эти фрагменты кода, которые я предоставил.
Что для меня самое странное, так это то, что javascript находит объект Android, но у него просто нет запрошенного метода (рукопожатие), как это может быть?
Любая помощь будет принята с благодарностью, так как это заставляло меня сходить с ума в течение последних 2 недель или около того (это ошибка, которую я возвращаю все время, а затем сдаюсь и т.д.).
Спасибо.
Ответы
Ответ 1
Из документации Android 4.2:
Внимание: если вы установили targetSdkVersion в 17 или выше, вы должны добавить аннотацию @JavascriptInterface к любому методу, по которому вы хотите получить код своей веб-страницы (этот метод также должен быть общедоступным). Если вы не предоставите аннотацию, метод не будет доступен вашей веб-странице при работе на Android 4.2 или выше.
Ответ 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
} }
Это сработало для меня. Попробуйте это.