在线咨询
QQ咨询
服务热线
服务热线:13125520620
TOP

html和java的交互,利用jsBridge开源框架

发布时间:2018-2-12 浏览:3334

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;
        }
    }
 
 
软件定制,博远电子,友情提醒。

 

TAG
软件定制,软件开发,瀚森HANSEN
0
该内容对我有帮助