博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
html和java的交互,利用jsBridge开源框架
阅读量:7091 次
发布时间:2019-06-28

本文共 7790 字,大约阅读时间需要 25 分钟。

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中打开文件的书写

java中,需要设置

webView.setWebChromeClient(mOpenFileWebChromeClient);
OpenFileWebChromeClient类
public class OpenFileWebChromeClient extends WebChromeClient {        public static final int REQUEST_FILE_PICKER = 1;        public ValueCallback
mFilePathCallback; public ValueCallback
mFilePathCallbacks; Activity mContext; public OpenFileWebChromeClient(Activity mContext){ super(); this.mContext = mContext; } // Android < 3.0 调用这个方法 public void openFileChooser(ValueCallback
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上传文件的
事件捕获 // Android > 4.1.1 调用这个方法 public void openFileChooser(ValueCallback
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
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;        }    }

后续使用中如果有问题,再次补充

转载于:https://www.cnblogs.com/fengchuxiaodai/p/8441466.html

你可能感兴趣的文章
python测试开发django-4.获取url参数和name的作用
查看>>
C# IEnumerable和IEnumerator的区别,如何实现
查看>>
android adb命令行工具使用
查看>>
[转]聊聊.net程序设计——浅谈使用VS2010建模拓展
查看>>
Central Europe Regional Contest 2011
查看>>
每天一个linux命令(12):more命令
查看>>
javascript 正则替换字符的新方法!
查看>>
OSGI:从面向接口编程来理解OSGI
查看>>
前端之JavaScript(1) - 浅谈JavaScript函数与栈
查看>>
WayOs 帐号到期自动清理工具,致浪费在清理到期用户的青春
查看>>
新买的mac笔记本,发现vi编辑器没有颜色的解决方案
查看>>
object-c 混编 调用C,C++接口
查看>>
JQuery Ajax实例总结
查看>>
CentOS中文件夹基本操作命令
查看>>
VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案...
查看>>
js判断图片是否存在,并做处理
查看>>
触摸屏
查看>>
webservice 测试窗体只能用于来自本地计算机的请求
查看>>
Java 中队列的使用
查看>>
再见 2014,你好 2015
查看>>