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は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の構造:
  • javascript: + name + . + method

  • 説明:
  • javascript:不変です.コロンを忘れないでください.
  • name:addJavascriptInterface(Object object,String name)メソッドを呼び出すときに設定されたnameで、両者は対応を維持します.method:呼び出しのメソッドであり、methodは呼び出しメソッドのメソッド名である.eg:Javaにはcallメソッドがあり、Htmlではjs中ダイヤルで、ダイヤルをクリックするとJavaでのcallメソッドが呼び出されます.

  • JavaでJavascriptを呼び出すルール:
    Java中構造:mWebView.loadUrl("javascript: + methodName('" + data + "')");この構造ではmethodNameとdataだけが変数であり、その他は可変ではなく、そのまま使用すればよい.
  • 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のメソッドを呼び出す文をスレッドで実行します.
  • //   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();
                }
            }
        }
    }