Android蓝牙局域聊天实现

前言

最近课程设计的大题目正好是基于蓝牙/IP/WebSocket等实现局域聊天功能,就想着把之前写过的有关蓝牙通信的代码重新整理一下,顺便完善一下相关功能(包括文字、表情、图片等相关功能的实现)


功能一览

  • 联系人列表
  • 基于蓝牙通信
  • 头像+名称显示在消息框上方
  • 变长变高信息框
  • 收发左右各自对齐
  • 内容可滚动
  • 聊天记录本地存储
  • 可发送表情包
  • 图文混排
  • 可发送拍摄图片

HaHa,原谅我写上面这些(毕竟我懒,直接把功能相关要求粘贴了过来,大家如果有需要的相关功能模块可以接着往下看)


这次重新整理代码完善功能,在设计上采用了MVP架构来进行设计(其实后来发现这些小项目是真的不太合适,MVC写起来会更舒服些),不过一定程度上也加深了对MVP架构的理解,也更加理解其与MVC最大的不同(ViewModel的彻底解耦)

借下面这张图和代码简单理解一下
在这里插入图片描述
其中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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值