IMKit 2.X 升级到 5.X
本文描述 IMKit SDK 从 2.X 到 5.X 版本的升级步骤。
变更说明
IMKit SDK 5.x 版本正式开源,此开源版本基于 MVVM 架构重构完成,因此和 2.x、4.x 版本不兼容,无法平滑升级。
详细变更说明如下:
1. 依赖包更改
Google 2018 IO 大会推出了扩展库 AndroidX,AndroidX 是对 android.support.xxx 包的整理后产物,Google 官方早已明确声明不再维护 support 包。因此融云 IMKit SDK 5.X 及以后版本更改为通过 AndroidX 实现,不再支持 support 包!
注意
如果您应用依赖于 support 包,可参考 AndroidX 迁移文档 将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。
2. 类路径调整
IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现,导致很多类路径发生了更改,下表列出了 5.X 之前版本对外公开类的路径变更:
2.x 、4.x 版本路径 | 5.x 版本路径 |
---|---|
io.rong.imkit.fragment.ConversationListFragment | io.rong.imkit.conversationlist.ConversationListFragment |
io.rong.imkit.fragment.ConversationFragment | io.rong.imkit.conversation.ConversationFragment |
io.rong.imkit.RongExtension | 无法直接替换。请按照 IMKit 5.x 的文档说 明重新集成插件。 |
io.rong.imkit.userInfoCache.RongUserInfoManager | io.rong.imkit.userinfo.RongUserInfoManager |
io.rong.imkit.mention.RongMentionManager | io.rong.imkit.feature.mention.RongMentionManager |
io.rong.imkit.manager.IUnReadMessageObserver | io.rong.imkit.manager.UnReadMessageManager.IUnReadMessageObserver |
io.rong.imkit.RongConfigurationManager | io.rong.imkit.utils.language.RongConfigurationManager |
关于路径调整的说明
- 参照上表,在 AndroidStudio 中 command+shift+R 全局搜索旧的类路径,替换为新路径。
io.rong.imkit.RongExtension
无法用替换的方式升级。请按照 IMKit 5.x 的文档说明重新集成插件。- 如果深度定制化了 IMKit SDK,部分类路径的调整可能不在上述列表中,升级以后 AndroidStudio 会有红色报错。删除报错类里红色未识别的导入路径,鼠标停留到报错的地方,根据 AndroidStudio 的提示导入新路径即可。如果有多个地方使用了该路径,可以参考第一步里的方法,全局搜索并替换。
3. 集成方式变更
页面跳转时由原先的隐式调用方式更改为显示调用, 因此集成步骤有所简化和更改。您需要先移除旧版本 AndroidManifest.xml 文件中关于 IMKit SDK 的配置,参考官网文档重新集成。
4. RongIM 接口变化
-
连接接口返回值变动。
connect() 方法返回值由 RongIM 更改为 void.
-
接口名称更改
2.x、4.x 接口 5.x 接口 无 removeOnReceiveMessageListener 无 removeConnectionStatusListener setSendMessageListener setMessageInterceptor sendImageMessage sendMediaMessage setMaxVoiceDurationg setMaxVoiceDuration startConversationList 无 startPublicServiceProfile 无
-
接口迁移。用户信息相关接口由 RongIM 迁移到了单独类 UserDataProvider 中。
2.x、4.x 接口 5.x 接口 RongIM.UserInfoProvider UserDataProvider.UserInfoProvider RongIM.GroupInfoProvider UserDataProvider.GroupInfoProvider RongIM.GroupUserInfoProvider UserDataProvider.GroupUserInfoProvider
-
RongIM 移除了以下和 UI 无关的接口,可改为调用 IMLib 核心类 RongIMClient 里的同名方法。
移除接口 saveTextMessageDraft setMessageExtra setMessageReceivedStatus setServerInfo setStatisticDomain supportResumeBrokenTransfer searchPublicService searchPublicServiceByType subscribePublicService unsubscribePublicService downloadMedia -
删除了以下接口,不再支持。
接口名称 refreshDiscussionCache createDiscussion createDiscussionChat getDiscussion quitDiscussion addMemberToDiscussion recordNotificationEvent isNotificationQuiteHoursConfigured getEncryptedSessionStatus getAllEncryptedConversations quitEncryptedSession isRegisted getHistoryMessages() 废弃方法 disconnect() 废弃方法
- 删除了旧版本里的废弃接口
5. 消息展示模板变更
列表页由 ListView 更改为效率更高的 RecycleView,因此自定义消息的展示模板需要对应调整。
- 将自定义消息的展示模板更改为继承
BaseMessageItemProvider<>
, 并实现基类方法。 - 移除展示模板里原先的注解,原注解属性可在新模板构建类里通过调用基类成员
mConfig
的各个方法进行配置
import android.content.Context;
import android.text.Spannable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import io.rong.imkit.R;
import io.rong.imkit.model.UiMessage;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.model.MessageContent;
public class CustomMessageItemProvider extends BaseMessageItemProvider<CustomMessage> {
public CustomMessageItemProvider(){
mConfig.showSummaryWithName = false; // 配置模板基本属性。
}
/**
* 创建 ViewHolder
* @param parent 父 ViewGroup
* @param viewType 视图类型
* @return ViewHolder
*/
@Override
protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_message_item, parent, false);
return new ViewHolder(parent.getContext(), rootView);
}
/**
* 设置消息视图里各 view 的值
* @param holder ViewHolder
* @param parentHolder 父布局的 ViewHolder
* @param customMessage 此展示模板对应的消息
* @param uiMessage {@link UiMessage}
* @param position 消息位置
* @param list 列表
* @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
*/
@Override
protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
}
/**
* @param holder ViewHolder
* @param customMessage 自定义消息
* @param uiMessage {@link UiMessage}
* @param position 位置
* @param list 列表数据
* @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
* @return 点击事件是否被消费
*/
@Override
protected boolean onItemClick(ViewHolder holder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
return false;
}
/**
* 根据消息内容,判断是否为本模板需要展示的消息类型
*
* @param messageContent 消息内容
* @return 本模板是否处理。
*/
@Override
protected boolean isMessageViewType(MessageContent messageContent) {
return messageContent instanceof CustomMessage ;
}
/**
* 在会话列表页某条 会话最后一条消息为该类型消息时,会话里需要展示的内容。
* 比如: 图片消息在会话里需要展示为"图片",那返回对应的字符串资源即可。
* @param context 上下文
* @param customMessage 自定义消息
* @return 会话里需要展示的字符串资源
*/
@Override
public Spannable getSummarySpannable(Context context, CustomMessage customMessage) {
return null;
}
}
6. 扩展区域自定义方式变更
输入区域配置方式变更,提供了 DefaultExtensionConfig 类,该类提供了 SDK 默认插件列表和表情列表。可以通过复写此类调整插件的位置或进行增减。