前言
最近课程设计的大题目正好是基于蓝牙/IP/WebSocket等实现局域聊天功能,就想着把之前写过的有关蓝牙通信的代码重新整理一下,顺便完善一下相关功能(包括文字、表情、图片等相关功能的实现)
功能一览
- 联系人列表
- 基于蓝牙通信
- 头像+名称显示在消息框上方
- 变长变高信息框
- 收发左右各自对齐
- 内容可滚动
- 聊天记录本地存储
- 可发送表情包
- 图文混排
- 可发送拍摄图片
HaHa,原谅我写上面这些(毕竟我懒,直接把功能相关要求粘贴了过来,大家如果有需要的相关功能模块可以接着往下看)
这次重新整理代码完善功能,在设计上采用了MVP
架构来进行设计(其实后来发现这些小项目是真的不太合适,MVC
写起来会更舒服些),不过一定程度上也加深了对MVP架构的理解,也更加理解其与MVC最大的不同(View
与Model
的彻底解耦)
借下面这张图和代码简单理解一下
其中Presenter层与Model层采用EventBus事件订阅机制进行实现,由Model层将相关数据结果进行回传,Presenter层接收到相关数据后,通过接口回调更新UI,简单的一个代码展示如下:
View
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TAKE_PHOTO) {
if (resultCode == RESULT_OK) {
//view层需要进行数据相关操作时将数据交给Presenter层
mPresenter.savaFile(imgUrl);
}
}
}
Presenter
@Override
public void savaFile(final String imgUrl) {
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = Glide.with(((ChatActivity) mView))
.asBitmap()
.load(imgUrl)
.submit(200, 200)
.get();
savePicToSdcard(imgUrl, bitmap);
sendData(new File(imgUrl));
}
}).start();
@Override
public void sendData(final File file) {
Log.i(TAG, "sendData: " + "图片消息");
//通过Model层来进行数据处理,后续的处理结果由EventBus进行回传
model.sendData(file);
EventBus.getDefault().post(new MessageEvent(ChatActivity.class, BLUE_TOOTH_IMAGE_WRITE_SUCCESS, file.getPath()));
}
Model
/**
* 图片传输协议
* @param file 图片文件
*/
@Override
public void sendData(File file) throws IOException {
Log.i(TAG, "sendData: "+"开始发送图片消息");
FileInputStream in=new FileInputStream(file);
sendData(IMAGE_START.getBytes());
Log.i(TAG, "sendData: "+"图片消息开头发送成功");
sendData(file.getName().getBytes());
Log.i(TAG, "sendData: "+"文件名称发送开始");
sendData(FILE_NAME_END.getBytes());
Log.i(TAG, "sendData: "+"文件名称发送结束");
byte[] bs=longToBytes(file.length());
Log.i(TAG, "sendData:发送文件长度 "+file.length());
sendData(bs);
Log.i(TAG, "sendData: "+"文件长度发送结束:");
int length;
byte[] b=new byte[1024];
while((length=in.read(b))>0){
mService.sendData(b,0,length);
}
sendData(IMAGE_END.getBytes());
Log.i(TAG, "sendData: "+"消息结束标志发送成功");
}
上述代码是图片发送的一个小模块,但也展示了这种架构的基本思想
由于蓝牙的传输速率慢,而我们使用直接调用系统的IMAGE_CAPTURE,拍摄得到的照片往往比较大,测试的时候传输要很久,因此在传送之前,我采用了Glide进行了一波压缩,上机测试秒送达(Emmmm 舒服啊,虽然传输得到的照片不能看,但还是真香)
附上几张效果图(UI没怎么去做,.9图也找不到合适的素材,大家将就看一下,可以自己clone下来再进行修改)
大致就这些啦,具体的功能模块还有代码大家可以去Github上去查看,觉得可以的话可以动动小手给个star,可能写的这篇帖子在有些理解上并不到位,欢迎大家交流指正最后最后附上地址https://github.com/LCoderFix/BluetoothChat.git