Kotlin高仿微信-第9篇-单聊-文本

 Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。

Kotlin高仿微信-项目实践58篇,点击查看详情

效果图:

详细的聊天功能请查看Kotlin高仿微信-第8篇-单聊,这里是提示文本功能的部分实现。

实现代码:

我的布局

<RelativeLayout
    android:id="@+id/chat_item_me_content_layout"
    app:layout_constraintEnd_toStartOf="@+id/chat_item_me_avatar"
    app:layout_constraintTop_toTopOf="@+id/chat_item_me_avatar"
    android:layout_width="280dp"
    android:gravity="right"
    android:visibility="gone"
    android:layout_height="wrap_content">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/chat_item_me_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="10dp"
        android:background="@drawable/wc_chat_me3_normal"
        android:gravity="left|center"
        android:paddingVertical="12dp"
        android:paddingLeft="12dp"
        android:paddingRight="18dp"
        android:text="我的"
        android:textColor="@color/black"
        android:textSize="18sp"/>
</RelativeLayout>

好友的布局:

<RelativeLayout
    android:id="@+id/chat_item_other_content_layout"
    app:layout_constraintStart_toEndOf="@+id/chat_item_other_avatar"
    app:layout_constraintTop_toTopOf="@+id/chat_item_other_avatar"
    android:visibility="gone"
    android:layout_width="280dp"
    android:layout_height="wrap_content">
    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/chat_item_other_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingVertical="12dp"
        android:paddingLeft="18dp"
        android:paddingRight="12dp"
        android:layout_marginStart="10dp"
        android:gravity="left|center"
        android:background="@drawable/wc_chat_other3_normal"
        android:visibility="visible"
        android:textColor="@color/black"
        android:textSize="18sp"
        android:text="1"/>
</RelativeLayout>
//发送文本
private fun sendMessage(chatBean: ChatBean){
    if(chatBean == null){
        ToastUtils.makeText(requireActivity(), "发送信息不能为空")
        return
    }
    var content = chatBean.content
    if(TextUtils.isEmpty(content)){
        ToastUtils.makeText(requireActivity(), "发送信息不能为空")
    } else {
        ChatManagerUtils.getInstance().sendMessage(toUserId, content)
        chat_content.setText("")
        CoroutineScope(Dispatchers.IO).launch {
            if(chatBean.contentType == ChatBean.CONTENT_TYPE_REDPACKET){
                var content = chatBean.content
                chatBean.content = CommonUtils.Chat.getRedpacket(content).toString()
            } else if(chatBean.contentType == ChatBean.CONTENT_TYPE_TRANSFER){
                var content = chatBean.content
                chatBean.content = CommonUtils.Chat.getTransfer(content).toString()
            }
            ChatRepository.insertChat(chatBean)
        }
        refreshBase(chatBean)
    }
}


/**
 * 刷新发送、接收聊天信息
 * @param chatBean ChatBean
 */
private fun refreshBase(chatBean: ChatBean){
    CoroutineScope(Dispatchers.Main).launch {
        //chatViewModel.insertChat(chatBean)
        TagUtils.d("ChatFragment refreshBase 刷新聊天信息 ")
        adapter.refresh(chatBean)
        if(chatBean.contentType == ChatBean.CONTENT_TYPE_LOCATION){
            delay(200)
        }
        swipe_target.scrollToPosition(adapter.itemCount -1)
    }
}

 

/**
 * 使用xmpp发送文本信息
 * @param toUser String 发送用户id
 * @param content String
 */
fun sendMessage(toUser : String, content : String){
    CoroutineScope(Dispatchers.IO).launch {
        TagUtils.d("ChatManagerUtils 处理文本, ${toUser}, ${content} , ${getChat(toUser)}")
        var msg = Message()
        msg.body = content
        getChat(toUser)?.sendMessage(msg)
    }
}
//插入数据库
fun insertChat(chatBean: ChatBean) : Long {
    var chatListLocal = getAllChat()
    if(chatListLocal == null || chatListLocal.size < 1){
        return WcDatabase.getInstance(WcApp.getContext()).chatDao().insertChat(chatBean)
    }
    var resultList = chatListLocal.filter {
        it.messageId.equals(chatBean.messageId)
    }
    //过滤重复数据
    if(resultList.size > 0){
        return 0
    }
    return WcDatabase.getInstance(WcApp.getContext()).chatDao().insertChat(chatBean)
}

接收消息监听代码:

override fun chatCreated(chat: Chat, createdLocally: Boolean) {
    TagUtils.d("消息监听回调:chat = ${chat} , createdLocally = ${createdLocally}")
    if(!createdLocally){
        chat.addMessageListener { chat, message ->
            TagUtils.d("获取好友发来的信息 ${message.from} , ${message.to}, ${message.body}")
            var content = message.getBody()
            if(!TextUtils.isEmpty(content) && content.length > 0){
                var fromUser = BaseUtils.getChatAccountFrom(message.from)
                var toUser = BaseUtils.getChatAccount(message.to)
                var userType = ChatBean.USER_TYPE_OTHER

                if(content.startsWith(CommonUtils.Chat.LOCATION_MARK)){
                    //发送定位
                    //去掉location###标志
                    var remarkContent = CommonUtils.Chat.getLocation(content)
                    //使用逗号分隔符,分别读取经纬度
                    var contents = remarkContent.split(",")
                    var latitude = contents[0].toDouble()
                    var longitude = contents[1].toDouble()
                    var chatBean = CommonUtils.Chat.getChatBean(fromUser, toUser, userType, content, ChatBean.CONTENT_TYPE_LOCATION, "", latitude, longitude)
                    ChatRepository.insertChat(chatBean)
                    chatBean.isReceive = true
                    EventBus.getDefault().post(chatBean)
                } else if(content.startsWith(CommonUtils.Chat.REDPACKET_MARK)){
                    //发送红包, 去掉redpacket###写入数据库
                    content = CommonUtils.Chat.getRedpacket(content).toString()
                    var chatBean = CommonUtils.Chat.getChatBean(fromUser, toUser, userType, content, ChatBean.CONTENT_TYPE_REDPACKET, "",0.0, 0.0)
                    ChatRepository.insertChat(chatBean)
                    chatBean.isReceive = true
                    EventBus.getDefault().post(chatBean)
                } else if(content.startsWith(CommonUtils.Chat.VOICE_MARK)){
                    //发送语音, 去掉voice###写入数据库
                    content = CommonUtils.Chat.getMedia(content, CommonUtils.Chat.VOICE_MARK)
                    var chatBean = CommonUtils.Chat.getChatBeanVoiceServer(fromUser, toUser, userType,ChatBean.CONTENT_TYPE_VOICE, content,0)
                    chatBean.isReceive = true
                    processDownload(chatBean)
                } else if(content.startsWith(CommonUtils.Chat.VIDEO_MARK)){
                    //发送小视频, 去掉video###写入数据库
                    content = CommonUtils.Chat.getMedia(content, CommonUtils.Chat.VIDEO_MARK)
                    var chatBean = CommonUtils.Chat.getChatBeanVideoServer(fromUser, toUser, userType,ChatBean.CONTENT_TYPE_VIDEO, content,0)
                    chatBean.isReceive = true
                    processDownload(chatBean)
                } else if(content.startsWith(CommonUtils.Chat.IMAGE_MARK)){
                    //发送图片, 去掉image###写入数据库
                    content = CommonUtils.Chat.getMedia(content, CommonUtils.Chat.IMAGE_MARK)
                    var chatBean = CommonUtils.Chat.getChatBeanImageServer(fromUser, toUser, userType,ChatBean.CONTENT_TYPE_IMG, content,0)
                    chatBean.isReceive = true
                    processDownload(chatBean)
                } else if(content.startsWith(CommonUtils.Chat.TRANSFER_MARK)){
                    //发送转账, 去掉transfer###写入数据库
                    content = CommonUtils.Chat.getTransfer(content).toString()
                    var chatBean = CommonUtils.Chat.getChatBean(fromUser, toUser, userType, content, ChatBean.CONTENT_TYPE_TRANSFER, "",0.0, 0.0)
                    ChatRepository.insertChat(chatBean)
                    chatBean.isReceive = true
                    EventBus.getDefault().post(chatBean)
                } else if(content.startsWith(CommonUtils.QRCommon.QR_RECEIVE_CODE)){
                    //向个人发送收款
                    var balance = content.substring(CommonUtils.QRCommon.QR_RECEIVE_CODE.length, content.length)
                    TagUtils.d("MyChatManagerListener 向个人发送收款金额: ${fromUser} , ${toUser},  ${balance}")
                    updateBalanceServer(fromUser, toUser, CommonUtils.User.OPERATOR_PLUS, balance.toFloat())
                } else if(content.startsWith(CommonUtils.QRCommon.QR_PAYMENT_CODE)){
                    //向商家付款
                    var balance = content.substring(CommonUtils.QRCommon.QR_RECEIVE_CODE.length, content.length)
                    TagUtils.d("MyChatManagerListener 向商家付款金额: ${fromUser} , ${toUser}, ${balance}")
                    updateBalanceServer(fromUser, toUser, CommonUtils.User.OPERATOR_MINUS, balance.toFloat())
                } else {
                    var chatBean = CommonUtils.Chat.getChatBean(fromUser, toUser, userType, content, ChatBean.CONTENT_TYPE_TEXT, "",0.0, 0.0)
                    ChatRepository.insertChat(chatBean)
                    chatBean.isReceive = true
                    EventBus.getDefault().post(chatBean)
                }
                ChatNotificationUtils.sendNotification(fromUser)
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值