JavaとJavaScriptの連携 (昔書いた記事をお引越ししました)
この記事は2013年11月12日に書いたものを引っ越したものです。
内容的には古いものです。
今日は卒論早く切り上げて帰ってきたので、
この前やったJavaとwebview内に書いたJavaScriptの連携について書いていこうと思います。
まず、簡単にまとめると
・Java側からJavaScriptの関数を呼び出すには webView.loadUrl("javascript:関数名") を利用する。
・JavaScript側からJavaの関数を呼び出すには JavascriptInterface を利用する。
・値の受け渡しはJSONを利用する。
これだけです。
そして以下はその具体的な書き方を書いていきます。
Java側からJavaScriptの関数を呼び出す
これは簡単です。
Java側
webView.loadUrl("javascript:sample(関数名)");
と書くと、JavaScript側に書いてあるsampleという関数が呼び出されます。
JavaScript側からJavaの関数を呼び出す
Java側
まず使用するクラスの?インスタンスを生成します。
Sample sample = new Sample();
そして生成したイスタンスをJavaScript上で使えるようにする。
webview.addJavascriptInterface(sample,"JSsample(JavaScript側で呼び出す時のオブジェクト名)");
あとはこれをJavaScript側で呼び出すだけです。
JSsample.(呼び出したいメソッド名);
これでJavaScript側からJavaの関数を呼び出すことができるようになります。
※ただし、このaddJavaScriptInterfaceを使用するのはセキュリティ上あまりよろしくないようなので、
使用する際は気を付けて使用するべきかもです。
あと、この addJavaScriptInterfaceを使用するとエミュレータが落ちますww
使用するエミュレータのバージョンにもよるらしいですけど、
とりあえず自分は2.3.3のエミュレータでやってたら落ちたので、
自分はこれを書いた以降はずっと実機でテストしてますw
値の受け渡し(Java→JavaScript)
Java側
JSONObject オブジェクト名 = new JSONObject;
オブジェクト名.put("変数名",値);
オブジェクト名.put("変数名",値);
オブジェクト名.put("変数名",値);
このような感じでJavaScript側へ渡したい値を変数名とともにオブジェクトに入れていきます。
そしてこのオブジェクトをreturnなどでJavaScriptへ渡します。
例1
public JSONObject sample(){
JSONObject obj = new JSONObject;
obj.put("sample1","a");
obj.put("sample2","b");
return obj;
}
と書いてJavaScript側からこのsample()を呼び出してもらえばいいのです。
もしくは、
例2
public void sample(){
JSONObject obj = new JSONObject;
obj.put("sample1","a");
obj.put("sample2","b");
webView.loadUrl("javascript:jsonsample("+ obj +")");
}
としてJSONObjectであるobjを引数としてJavaScriptの関数を呼び出せばよいのです。
Javaから渡されたJSONObjectのオブジェクト名がobjだとします。
そしてobjにはsample1とsample2があるとします。
この場合
JSON.parse(obj);
変数名 = JSONObject.sample1;
変数名 = JSONObject.sample2
と書けばいいのです。
うん、初めてこういうことやったから調べてたときは難しいって思ったけど、
やってみると意外と簡単にできた♪
公開処刑(中間発表)まであと2週間ww