const WXAlbum = weex.requireModule('wxalbum'); upload () { let path = 'public/upload/'; let vm = this; storage.getItem('token', event => { let param = { type: 'image/jpeg', // 选择的数据类型 path: path, url: CONSTANT.SERVER_URL + '/users/upload', token: event.data }; WXAlbum.choosePhoto(JSON.stringify(param), ret => { let obj = JSON.parse(ret); vm.imgPath = 'https://www.jb51.net/' + path + obj.file[0].originalFilename; modal.alert({ message: vm.imgPath, okTitle: '确认' }, function () { console.log('alert callback') }) }); }) },
4.4.3、WebSocket 功能实现
(1)存在问题
Weex 官网的 webSocket 章节特意标注以下警告字眼:
h5 提供 WebSockets 的 protocol 默认实现,iOS 和 Android 需要自定义实现,Android 可参考:
DefaultWebSocketAdapter.java
DefaultWebSocketAdapterFactory.java
好吧,根本没有封装 WebSocket 功能,那我就按官网给的参考来实现吧,于是,我点击前面两个参考链接,链接打开的页面根本不存在,报 404(官网出现这种问题,实在不应该啊)。网上谷歌搜索一圈,没有发现类似的问题,还是主要查看了这个给的 url 以及结合阿里将 weex 贡献给 Apache 维护这个事情,猜测是不是 Weex 捐给 Apache 维护,github 的库目录更改,但是官网对应的 url 地址没有做修改。经过查找,确实是这个问题,在旧库中以下目录找到官网提的:DefaultWebSocketAdapter.java 和 DefaultWebSocketAdapterFactor.java :
https://github.com/alibaba/weex/tree/master/android/commons/src/main/java/com/alibaba/weex/commons/adapter
(2)手动实现 WebSocket 功能
我们 在 weex_projectplatformsandroidappsrcmainjavacomweexappadapter 目录底下创建 Websocket 的实现类 DefaultWebSocketAdapter.java 和工厂创建类 DefaultWebSocketAdapterFactory.java ,关键逻辑代码如下:
// 该类主要实现 Websocket 的连接、发送消息、接收消息、关闭等函数或事件 public class DefaultWebSocketAdapter implements IWebSocketAdapter { @Override public void connect(){...} @Override public void send(String data) {...} @Override public void close(int code, String reason) {...} @Override public void destroy() {...} ... }
然后,为该类主要为创建 Websocket 对象的工厂类:
// 该类主要为创建 Websocket 对象的工厂类 public class DefaultWebSocketAdapterFactory implements IWebSocketAdapterFactory { @Override public IWebSocketAdapter createWebSocketAdapter() { return new DefaultWebSocketAdapter(); } }
接下来,在 weex_projectplatformsandroidappsrcmainjavacomweexappWXApplication.java 中初始化 Websocket ,如下所示:
WXSDKEngine.initialize(this, new InitConfig.Builder().setImgAdapter(new ImageAdapter()). setWebSocketAdapterFactory(new DefaultWebSocketAdapterFactory()).build() );
然后,在 Weex 的前端中导入Websocket模块,就可以使用 Websocket,相关代码如下:
const ws = weex.requireModule('webSocket'); ws.WebSocket(CONSTANT.SOCKET_WS, ''); // 需要注意 web 端的写法和 android 端的写法不一样 // android 的 onxx 事件是一个方法,需要传入一个JSCallback的值, if (weex.config.env.platform === 'Web') { ws.onmessage = this.socketMessage; } else { ws.onmessage(this.socketMessage); }
4.4.4、点击手机物理键返回上一级功能
(1)存在问题
我们开发的 Weex app,如果在 app 的哪个界面,点击手机的返回上一级物理键,都会导致 app 退出,好吧,Weex 也没有提供对应的事件处理,我们不得不自己再去写安卓的 java 代码去向 Weex 的 Web 端抛出这个事件。
(2)重写手机物理键返回上一级的处理逻辑
正常交互逻辑:当处于主界面时,返回上一级物理键会进行提示“再点击一次退出”,如果不是处于主界面时,会返回上一级页面。
首先,我们在 weex_projectplatformsandroidappsrcmainjavacomweexappWXPageActivity.java 中添加监听点击手机物理键的事件,如下所示:
public void onBackPressed(){ Map<String,Object> params=new HashMap<>(); params.put("name","msg"); mInstance.fireGlobalEventCallback("androidback",params); }
在 Weex 的 vue 入口文件中,监听 androidback 事件,当接收到该事件时,进行相应的逻辑处理,代码如下所示:
listenAndroidBack () { let vm = this; globalEvent.addEventListener('androidback', function (e) { if (vm.$route.name === 'tabIndex' || vm.$route.name === 'loginPage') { if (vm.exitFlag) { weex.requireModule('wxclose').closeApp(); } else { modal.toast({ message: '再点一次退出', duration: 1 }); vm.exitFlag = true; vm.clearExitFlag(); } } else { vm.$router.go(-1); } }); },
4.4.5、Android 显示本地图片
(1)存在问题