html中,js註冊監聽和回調 java中,註冊監聽和回調 java給js發消息,不接收js響應 java給js發消息,接受js響應 js給java發消息,不接收java響應 js給java發消息,接受java響應 js中打開文件的書寫 java中,需要設置 java中,當前activity的onA ...
html中,js註冊監聽和回調
function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { callback(WebViewJavascriptBridge) } else { document.addEventListener( 'WebViewJavascriptBridgeReady' , function() { callback(WebViewJavascriptBridge) }, false ); } } connectWebViewJavascriptBridge(function(bridge) { bridge.init(function(message, responseCallback) { alert('init方法js收到的消息:'+message); if(message.indexOf("url=")>=0){ var url = message.substring(4,message.length); alert("收到url:"+url); } if (responseCallback) { responseCallback('js返回的消息');//js的返回,java收取
}
}
);
bridge.registerHandler("functionInJs", function(data, responseCallback) {//"submitFromWeb"為html和java協商的協議字元串,可以通過registerHandler設置多個不同的協商串和回調
alert('registerHandler方法js收到的消息:'+data);
if('java調用js'==data){
showAlert("js自己的方法");
}
if (responseCallback) {
responseCallback('js返回的消息');//js的返回,java收取
}
});
java中,註冊監聽和回調
webView.setDefaultHandler(new DefaultHandler() { @Override public void handler(String data, CallBackFunction function) { Log.d(TAG, "setDefaultHandler方法java收到的消息:" + data); if ("openFile".equals(data)) { pickFile(); return; } if (function != null) { function.onCallBack("java返回的消息");//java的返回,js收取
} } }); webView.setWebChromeClient(mOpenFileWebChromeClient);//html動畫需要註冊的操作對象供webview使用
webView.registerHandler("submitFromWeb", new BridgeHandler() {//"submitFromWeb"為html和java協商的協議字元串,可以通過registerHandler設置多個不同的協商串和回調
@Override
public void handler(String data, CallBackFunction function) {
Log.i(TAG, "registerHandler方法java收到的消息:" + data);
function.onCallBack("java返回的消息");//java的返回,js收取
}
});
java給js發消息,不接收js響應
webView.send("java給js發送的消息");
java給js發消息,接受js響應
if (button.equals(v)) { webView.callHandler("functionInJs", "java調用js", new CallBackFunction() { @Override public void onCallBack(String data) { // TODO Auto-generated method stub Log.i(TAG, "js返回的消息: " + data); } });
js給java發消息,不接收java響應
function testClick() { var data = "js發出的消息"; window.WebViewJavascriptBridge.send(data); }
js給java發消息,接受java響應
function testClick33(){ var data = "js發出的消息"; window.WebViewJavascriptBridge.send(data , function(responseData) { alert('java返回的消息:'+responseData) }); } function testClick1() { window.WebViewJavascriptBridge.callHandler( 'submitFromWeb' , 'js調用java方法' , function(responseData) { alert('java返回的消息:'+responseData) } ); }
js中打開文件的書寫
<input type="file" value="選擇文件" />
java中,需要設置
webView.setWebChromeClient(mOpenFileWebChromeClient);
OpenFileWebChromeClient類
public class OpenFileWebChromeClient extends WebChromeClient { public static final int REQUEST_FILE_PICKER = 1; public ValueCallback<Uri> mFilePathCallback; public ValueCallback<Uri[]> mFilePathCallbacks; Activity mContext; public OpenFileWebChromeClient(Activity mContext){ super(); this.mContext = mContext; } // Android < 3.0 調用這個方法 public void openFileChooser(ValueCallback<Uri> filePathCallback) { mFilePathCallback = filePathCallback; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); } // 3.0 + 調用這個方法 public void openFileChooser(ValueCallback filePathCallback, String acceptType) { mFilePathCallback = filePathCallback; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); } // / js上傳文件的<input type="file" name="fileField" id="fileField" />事件捕獲 // Android > 4.1.1 調用這個方法 public void openFileChooser(ValueCallback<Uri> filePathCallback, String acceptType, String capture) { mFilePathCallback = filePathCallback; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); } @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { mFilePathCallbacks = filePathCallback; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); mContext.startActivityForResult(Intent.createChooser(intent, "File Chooser"), REQUEST_FILE_PICKER); return true; } }
java中,當前activity的onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == OpenFileWebChromeClient.REQUEST_FILE_PICKER) { if (mOpenFileWebChromeClient.mFilePathCallback != null) { Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData(); if (result != null) { String path = MediaUtility.getPath(getApplicationContext(), result); Uri uri = Uri.fromFile(new File(path)); mOpenFileWebChromeClient.mFilePathCallback .onReceiveValue(uri); } else { mOpenFileWebChromeClient.mFilePathCallback .onReceiveValue(null); } } if (mOpenFileWebChromeClient.mFilePathCallbacks != null) { Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData(); if (result != null) { String path = MediaUtility.getPath(getApplicationContext(), result); Uri uri = Uri.fromFile(new File(path)); mOpenFileWebChromeClient.mFilePathCallbacks .onReceiveValue(new Uri[] { uri }); } else { mOpenFileWebChromeClient.mFilePathCallbacks .onReceiveValue(null); } } mOpenFileWebChromeClient.mFilePathCallback = null; mOpenFileWebChromeClient.mFilePathCallbacks = null; } }
後續使用中如果有問題,再次補充