web-dev-qa-db-fra.com

Android 4.2.1, WebView et interface javascript saute

J'ai une vue Web avec une interface javascript ajoutée qui fonctionne parfaitement sur la plupart des appareils, à l'exception de ceux qui exécutent Android 4.2.1.

J'ai supprimé la plupart du code et suis resté avec un code très basique:

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

Du côté javascript, le code de test ressemble à ceci:

Android.handshake();

Mais je reçois ceci dans le logcat:

E/Web Console: UnCaught TypeError: Object [object Object] n'a pas de méthode 'handshake'

Encore une fois, cette même chose fonctionne correctement sur les appareils qui ont un ancien Android os (<4.2.1) que j'ai testé (la version minimale étant 2.3.3).

Ce qui est étrange, c'est que si je démarre un tout nouveau projet, avec rien d'autre qu'une seule activité qui a juste une WebView, avec le même code, tout fonctionne bien même pour 4.2.1, mais quand ça fait partie de mon projet réel, les choses se cassent . Je ne fais rien avec la vue Web qui n'est pas incluse dans les extraits de code que j'ai fournis.

Ce qui est le plus étrange pour moi, c'est que le javascript trouve l'objet Android mais il n'a tout simplement pas la méthode demandée (poignée de main), comment cela peut-il être?

Toute aide sera grandement appréciée car cela me rend fou depuis environ 2 semaines (c'est un bug auquel je reviens tout le temps, puis j'abandonne, etc.). Merci.

34
Nitzan Tomer

Dans la documentation Android 4.2:

Attention: Si vous avez défini votre targetSdkVersion sur 17 ou supérieur, vous devez ajouter l'annotation @JavascriptInterface à toute méthode que vous souhaitez rendre disponible le code de votre page Web (la méthode doit également être publique). Si vous ne fournissez pas l'annotation, la méthode ne sera pas accessible par votre page Web lors de l'exécution sur Android 4.2 ou supérieur.

96