Android WebViewはjsを使用してjavaと対話する(二)
5601 ワード
Android WebView使用(一)Android WebView使用jsとjavaのインタラクション(二)AndroidとIOS使用jsBridgeインタラクション方法
前言
この記事では主にJavaとローカルのHtmlのJSとのインタラクションについて紹介します.
ステップWebViewコントロールをレイアウトファイルに追加します. WebViewインスタンスが取得されました. setJavaScriptEnabled(true)メソッド設定サポートJSを呼び出す. addJavascriptInterface(Object object,String name)メソッドを呼び出しjavascriptの呼び出しメソッドをロードします. loadUrl(String url)メソッドを呼び出してローカルのHtmlをロードします.説明:ローカルのHtmlファイルをロードする場合、urlは
APIの説明
addJavascriptInterface(Object object, String name)
パラメータの説明:
1番目のパラメータはhtmlページの呼び出し方法を含むクラスであり、2番目のパラメータはクラスを呼び出すときのタグである.
JavascriptでJavaを呼び出すルール:
Htmlの構造: javascript: + name + . + method
説明:javascript:不変です.コロンを忘れないでください. name:addJavascriptInterface(Object object,String name)メソッドを呼び出すときに設定されたnameで、両者は対応を維持します.method:呼び出しのメソッドであり、methodは呼び出しメソッドのメソッド名である.eg:Javaにはcallメソッドがあり、Htmlではjs中
JavaでJavascriptを呼び出すルール:
Java中構造:methodName:Javascriptのメソッド data:入力されたデータを指します.
実際に使用する際の重要な注意点Android 4.2以降コメント文を付ける@JavascriptInterface Android 4.2以前にwebviewに注入されたオブジェクトに露出したインタフェースにコメント文@JavascriptInterfaceはなく、4.2以降にコメント文@JavascriptInterface 公式ドキュメントでは、JavaScriptがホストアプリケーションを制御できるようになっているため、このインタフェースは強力な特性ですが、JavaScriptは、Javaスクリプトがwebviewに注入されたjavaオブジェクトに反射アクセスするpublic fieldsを使用し、信頼されていないコンテンツを含むWebViewでこの方法を使用することができるため、4.2のバージョン前に重大なセキュリティ上の危険性があります.攻撃者はホストアプリケーションを改ざんし、ホストアプリケーションの権限を使用してjavaコードを実行することができます.従って4.2以降、JSに露出するインタフェースはいずれも追加する必要がある.Androidの上位バージョンでJavaScriptのメソッドを呼び出す文をスレッドで実行します.
サンプルコード:
htmlコード:
Javaコード:
前言
この記事では主にJavaとローカルのHtmlのJSとのインタラクションについて紹介します.
ステップ
file:///android_asset/ + htmlname.html
です.eg: mWebView.loadUrl("file:///android_asset/index.html")
; APIの説明
addJavascriptInterface(Object object, String name)
パラメータの説明:
1番目のパラメータはhtmlページの呼び出し方法を含むクラスであり、2番目のパラメータはクラスを呼び出すときのタグである.
JavascriptでJavaを呼び出すルール:
Htmlの構造:
説明:
ダイヤル
で、ダイヤルをクリックするとJavaでのcallメソッドが呼び出されます.JavaでJavascriptを呼び出すルール:
Java中構造:
mWebView.loadUrl("javascript: + methodName('" + data + "')");
この構造ではmethodNameとdataだけが変数であり、その他は可変ではなく、そのまま使用すればよい.実際に使用する際の重要な注意点
// javascript show()
mHandler.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:show('" + json + "')");
}
});
サンプルコード:
htmlコード:
Insert title here
function show(jsondata){
//[{name:"xxx",amount:600,phone:"13988888"},{name:"bb",amount:200,phone:"1398788"}]
var jsonobjs = eval(jsondata);
var table = document.getElementById("personTable");
for(var y=0; y<jsonobjs.length; y++){
var tr = table.insertRow(table.rows.length); //
//
var td1 = tr.insertCell(0);
var td2 = tr.insertCell(1);
td2.align = "center";
var td3 = tr.insertCell(2);
td3.align = "center";
//
td1.innerHTML = jsonobjs[y].name;
td2.innerHTML = jsonobjs[y].amount;
td3.innerHTML = "<a href='javascript:contact.call(\""+ jsonobjs[y].phone+ "\")'>"+ jsonobjs[y].phone+ "</a>";
}
}
Javaコード:
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.web_view);
mWebView.loadUrl("file:///android_asset/index.html");
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JSObject(),"contact");
}
public class JSObject{
@JavascriptInterface
public void call(String phone){
Log.e("phone", "phone---->" + phone);
}
@JavascriptInterface
public void showContacts(){
try {
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "zhangsan");
jsonObject.put("amount", "50");
jsonObject.put("phone", "123465798");
jsonArray.put(jsonObject);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("name", "lisi");
jsonObject1.put("amount", "48");
jsonObject1.put("phone", "987456123");
jsonArray.put(jsonObject1);
final String json = jsonArray.toString();
// javascript show()
mHandler.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl("javascript:show('" + json + "')");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}