- 实现了聊天消息发送功能,支持文本、图片、视频、音频、文件等多种消息类型 - 集成了文件上传下载功能,支持多媒体文件的传输和管理 - 添加了群组管理功能,包括创建群组、成员管理、权限控制等操作 - 实现了好友系统,支持好友添加、删除、分组等功能 - 集成了黑名单管理,提供用户屏蔽和解除屏蔽功能 - 添加了会话管理功能,支持对话列表、未读消息统计等 - 实现了历史消息查询和搜索功能 - 添加了实时连接状态管理和自动重连机制
325 行
7.4 KiB
Markdown
325 行
7.4 KiB
Markdown
# Android IM 接入
|
||
|
||
基于 `sdk-im` 模块实现即时通讯功能。
|
||
|
||
---
|
||
|
||
## 初始化详情
|
||
|
||
在 `Application.onCreate()` 中完成初始化,只需传入 `appKey`:
|
||
|
||
```kotlin
|
||
import com.xuqm.sdk.XuqmSDK
|
||
import com.xuqm.sdk.core.LogLevel
|
||
|
||
class MyApp : Application() {
|
||
override fun onCreate() {
|
||
super.onCreate()
|
||
XuqmSDK.initialize(
|
||
context = this,
|
||
appKey = "your_app_key",
|
||
logLevel = LogLevel.WARN, // 可选:DEBUG / INFO / WARN / ERROR
|
||
)
|
||
}
|
||
}
|
||
```
|
||
|
||
> 服务器地址由 SDK 内置,**无需传 `serverUrl`**。
|
||
|
||
---
|
||
|
||
## 登录鉴权(UserSig)
|
||
|
||
`userSig` 由业务服务端签发。登录只需 `userId + userSig`:
|
||
|
||
```kotlin
|
||
import androidx.lifecycle.lifecycleScope
|
||
import com.xuqm.sdk.XuqmSDK
|
||
import kotlinx.coroutines.launch
|
||
|
||
lifecycleScope.launch {
|
||
XuqmSDK.login(
|
||
userId = "user_001",
|
||
userSig = "your_user_sig_jwt",
|
||
)
|
||
}
|
||
```
|
||
|
||
> 登录成功后,IM 模块会自动连接,Push 模块会自动注册设备 Token。
|
||
|
||
---
|
||
|
||
## 单聊消息收发
|
||
|
||
### 监听实时消息
|
||
|
||
```kotlin
|
||
import com.xuqm.sdk.im.ImSDK
|
||
import com.xuqm.sdk.im.listener.ImEventListener
|
||
import com.xuqm.sdk.im.model.ImMessage
|
||
|
||
ImSDK.addListener(object : ImEventListener {
|
||
override fun onConnected() { /* IM 已连接 */ }
|
||
override fun onMessage(msg: ImMessage) { /* 单聊消息 */ }
|
||
override fun onGroupMessage(msg: ImMessage) { /* 群聊消息 */ }
|
||
override fun onRead(msg: ImMessage) { /* 对方已读回执 */ }
|
||
override fun onRevoke(msg: ImMessage) { /* 消息被撤回 */ }
|
||
override fun onDisconnected(reason: String?) { /* 断线处理 */ }
|
||
override fun onError(error: String) { /* 错误回调 */ }
|
||
})
|
||
```
|
||
|
||
### 发送文本消息
|
||
|
||
```kotlin
|
||
ImSDK.sendTextMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
content = "Hello!",
|
||
)
|
||
```
|
||
|
||
### 发送多媒体消息
|
||
|
||
```kotlin
|
||
// 图片(需先调用 FileSDK 上传)
|
||
ImSDK.sendImageMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
file = uploadResult,
|
||
width = 800,
|
||
height = 600,
|
||
)
|
||
|
||
// 视频
|
||
ImSDK.sendVideoMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
file = uploadResult,
|
||
width = 1920,
|
||
height = 1080,
|
||
durationMs = 15_000,
|
||
)
|
||
|
||
// 语音
|
||
ImSDK.sendAudioMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
file = uploadResult,
|
||
durationMs = 5_000,
|
||
)
|
||
|
||
// 文件
|
||
ImSDK.sendFileMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
file = uploadResult,
|
||
)
|
||
|
||
// 位置
|
||
ImSDK.sendLocationMessage(
|
||
toId = "user_002",
|
||
chatType = "SINGLE",
|
||
latitude = 31.2304,
|
||
longitude = 121.4737,
|
||
title = "上海",
|
||
address = "上海市黄浦区",
|
||
)
|
||
```
|
||
|
||
### 获取历史消息
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
val history = ImSDK.fetchHistory("user_002", page = 0, size = 20)
|
||
// 带筛选的历史消息
|
||
val filtered = ImSDK.fetchHistoryWithFilters(
|
||
toId = "user_002",
|
||
page = 0,
|
||
size = 20,
|
||
msgType = "TEXT",
|
||
keyword = "会议",
|
||
)
|
||
}
|
||
```
|
||
|
||
### 撤回与编辑
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
ImSDK.revokeMessage(messageId)
|
||
ImSDK.editMessage(messageId, "新内容")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 群聊
|
||
|
||
### 创建群组
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
val group = ImSDK.createGroup(
|
||
name = "项目讨论",
|
||
memberIds = listOf("user_002", "user_003"),
|
||
groupType = "WORK", // 可选:WORK / PUBLIC / PRIVATE
|
||
)
|
||
}
|
||
```
|
||
|
||
### 订阅群消息
|
||
|
||
```kotlin
|
||
ImSDK.subscribeGroup("group_xxx")
|
||
```
|
||
|
||
### 发送群消息
|
||
|
||
```kotlin
|
||
ImSDK.sendTextMessage(
|
||
toId = "group_xxx",
|
||
chatType = "GROUP",
|
||
content = "大家好",
|
||
)
|
||
```
|
||
|
||
### 群成员管理
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
// 添加成员
|
||
ImSDK.addGroupMember("group_xxx", "user_004")
|
||
// 移除成员
|
||
ImSDK.removeGroupMember("group_xxx", "user_004")
|
||
// 批量添加/移除
|
||
ImSDK.batchAddGroupMembers("group_xxx", listOf("user_005", "user_006"))
|
||
ImSDK.batchRemoveGroupMembers("group_xxx", listOf("user_005", "user_006"))
|
||
// 设置角色
|
||
ImSDK.setGroupRole("group_xxx", "user_004", "ADMIN")
|
||
// 禁言
|
||
ImSDK.muteGroupMember("group_xxx", "user_004", minutes = 60)
|
||
// 转让群主
|
||
ImSDK.transferGroupOwner("group_xxx", "user_002")
|
||
// 退出群聊
|
||
ImSDK.leaveGroup("group_xxx")
|
||
// 解散群聊
|
||
ImSDK.dismissGroup("group_xxx")
|
||
}
|
||
```
|
||
|
||
### 群信息查询
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
val groups = ImSDK.listGroups()
|
||
val publicGroups = ImSDK.listPublicGroups(keyword = "项目")
|
||
val group = ImSDK.getGroupInfo("group_xxx")
|
||
val members = ImSDK.listGroupMembers("group_xxx")
|
||
val history = ImSDK.fetchGroupHistory("group_xxx", page = 0, size = 20)
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 好友管理
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
// 好友列表
|
||
val friends = ImSDK.listFriends()
|
||
// 添加好友
|
||
ImSDK.addFriend("user_002")
|
||
// 删除好友
|
||
ImSDK.removeFriend("user_002")
|
||
// 批量操作
|
||
ImSDK.batchAddFriends(listOf("user_002", "user_003"))
|
||
ImSDK.batchRemoveFriends(listOf("user_002", "user_003"))
|
||
// 好友分组
|
||
ImSDK.setFriendGroup("user_002", "同事")
|
||
val groups = ImSDK.listFriendGroups()
|
||
// 好友请求
|
||
ImSDK.sendFriendRequest("user_002", remark = "你好")
|
||
val requests = ImSDK.listFriendRequests(direction = "incoming")
|
||
ImSDK.acceptFriendRequest("request_id")
|
||
ImSDK.rejectFriendRequest("request_id")
|
||
// 黑名单
|
||
ImSDK.addToBlacklist("user_002")
|
||
ImSDK.removeFromBlacklist("user_002")
|
||
val check = ImSDK.checkBlacklist("user_002")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 会话列表
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
val conversations = ImSDK.listConversations()
|
||
// 置顶
|
||
ImSDK.setConversationPinned("user_002", "SINGLE", true)
|
||
// 免打扰
|
||
ImSDK.setConversationMuted("user_002", "SINGLE", true)
|
||
// 标记已读
|
||
ImSDK.markRead("user_002", "SINGLE")
|
||
// 草稿
|
||
ImSDK.setDraft("user_002", "SINGLE", "草稿内容")
|
||
// 删除会话
|
||
ImSDK.deleteConversation("user_002", "SINGLE")
|
||
// 总未读数
|
||
val totalUnread = ImSDK.getTotalUnreadCount()
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 离线消息同步
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
// 查询离线消息数量
|
||
val count = ImSDK.offlineMessageCount()
|
||
// 同步离线消息
|
||
val offlineMessages = ImSDK.syncOfflineMessages()
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 连接状态监听
|
||
|
||
```kotlin
|
||
lifecycleScope.launch {
|
||
ImSDK.connectionState.collect { state ->
|
||
when (state) {
|
||
is ImConnectionState.Connected -> { /* 已连接 */ }
|
||
is ImConnectionState.Connecting -> { /* 连接中 */ }
|
||
is ImConnectionState.Disconnected -> { /* 已断开:state.reason */ }
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 消息类型
|
||
|
||
| MsgType | 说明 | content 结构 |
|
||
|---------|------|-------------|
|
||
| `TEXT` | 纯文本 | `String` |
|
||
| `IMAGE` | 图片 | `{url, width, height, thumbnailUrl?}` |
|
||
| `VIDEO` | 视频 | `{url, duration, thumbnailUrl, size}` |
|
||
| `AUDIO` | 语音 | `{url, duration, size}` |
|
||
| `FILE` | 文件 | `{url, name, size, mimeType}` |
|
||
| `LOCATION` | 位置 | `{lat, lng, address, title}` |
|
||
| `CUSTOM` | 自定义 | 任意 JSON |
|
||
| `NOTIFY` | 系统通知 | `{title, content}` |
|
||
| `RICH_TEXT` | 富文本 | `{html}` |
|
||
| `CALL_AUDIO` | 语音通话信令 | `{action}` |
|
||
| `CALL_VIDEO` | 视频通话信令 | `{action}` |
|
||
| `FORWARD` | 转发 | `{originalSender, originalContent}` |
|
||
| `QUOTE` | 引用 | `{quotedMsgId, quotedContent, text}` |
|
||
| `MERGE` | 合并转发 | `{title, msgList}` |
|
||
| `REVOKED` | 撤回 | 系统内部填充 |
|