web-dev-qa-db-ja.com

Android 4.2.1、WebViewおよび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コンソール:キャッチされないTypeError:オブジェクト[オブジェクトObject]にはメソッド 'handshake'がありません

繰り返しますが、これとまったく同じことは、テスト済みの古いAndroid os(<4.2.1)(最小バージョンは2.3.3)のデバイスで正常に動作します。

奇妙なことは、WebViewだけを持ち、同じコードを持つ単一のアクティビティだけで完全に新しいプロジェクトを開始すると、4.2.1でもすべてが正常に機能することですが、それが実際のプロジェクトの一部である場合、問題が発生します。私が提供したこのコードスニペットに含まれていないwebviewで私がやっていることは何もありません。

私にとって最も奇妙なのは、javascriptがAndroidオブジェクトを見つけたが、リクエストされたメソッド(ハンドシェイク)を持たないことです。

これは過去2週間ほど私を夢中にさせてきたので、どんな助けも大歓迎です(それは私がいつも戻って、それからあきらめるなどのバグです)。ありがとう。

34
Nitzan Tomer

Android 4.2ドキュメントから:

注意:targetSdkVersionを17以上に設定した場合、@ JavascriptInterfaceアノテーションをWebページコードで使用できるようにするメソッドに追加する必要があります(メソッドもパブリックである必要があります)。注釈を指定しない場合、Android 4.2以降で実行している場合、Webページからメソッドにアクセスできません。

96

JavaScriptで使用できるようにするJavaクラスの(@JavascriptInterface)メソッドに注釈を付ける必要があります。

    public class JavaScriptInterface {
Context context;


JavaScriptInterface(Context c) {
    context = c;
}

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

それは私のために働いた。これを試してください。

4
Raghu