webview+h5這種混合開發最近很火,其中最重要的大概就是java代碼和js的交互了,剛接觸這東西兩天,寫寫收獲。
新建一個assets文件夾,要與res這個文件夾同級,其中存放web項目。
先看android端
初始化webview
1 // 設置支持JavaScript等 2 webView = (WebView) findViewById(R.id.webView); 3 settings = webView.getSettings(); 4 settings.setJavaScriptEnabled(true); 5 settings.setCacheMode(WebSettings.LOAD_DEFAULT); //緩存 6 settings.setDomStorageEnabled(true); //使用localStorage則必須打開 7 settings.setDatabaseEnabled(true); 8 settings.setAppCacheEnabled(true); 9 settings.setAllowFileAccess(true); 10 settings.setSupportZoom(true); 11 settings.setBuiltInZoomControls(true); 12 settings.setRenderPriority(WebSettings.RenderPriority.HIGH); //提高渲染優先級 13 settings.setBlockNetworkImage(false); //把圖片放在最后渲染 14 webView.setWebChromeClient(new WebChromeClient()); 15 16 webView.addJavascriptInterface(new Object() { 17 @JavascriptInterface 18 public void onUseCamera() { 19 //use system camera 20 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 21 startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 22 } 23 24 }, "camera"); 25 webView.addJavascriptInterface(new Object() { 26 27 @JavascriptInterface 28 public String onGetPic() { 29 return file.getAbsolutePath(); 30 } 31 }, "getPicture"); 32 webView.loadUrl("file:///android_asset/login_content.html");
這里執行了點擊h5中的按鈕,調用系統相機的操作,onActivityResult就不寫了,網上一大堆,不過需要注意,onactivityResult中要有
webView.loadUrl("javascript:getPic(" + ")");這樣一句代碼
。其中名字為camera的javascrptInterface是調用照相機,getPicture的是返回照片路徑給js。
下面就是js了
1 function useCamera(){ 2 window.camera.onUseCamera(); 3 } 4 function getPic(){ 5 var filePath = window.getPicture.onGetPic(); 6 alert(filePath); 7 document.getElementById("testImage").src=filePath; 8 }
主要就是這樣的兩個方法,其中useCamera是要在html的button的onclick中調用,getPic是在上面的onActivityForResult中調用,通過文件路徑更改id是testImage的圖片。
這樣直接傳文件路徑在web項目部署在服務器時是訪問不到的,這個應該有解決方案,可惜我沒有找到。還有個問題待解決,傳一個string的文件路徑沒問題,但是如果直接傳File類型的文件時,js死活都識別不出文件來,目測應該用h5的FileReader進行操作,可惜我又沒成功。。。以上