privatepython class privateCJActivity extends Activity帮忙具体解释下嘛,新手,谢谢

Android SDK 开发指南 - 融云 RongCloud
Android 开发文档
web 开发文档
Android SDK 开发指南
以下视频是对融云 Android SDK 开发使用的详细讲解,您可以在阅读文档时配合学习。
更多视频教程如下:
注册开发者帐号
开发者在集成融云即时通讯、实时网络能力前,需前往注册创建融云开发者帐号。
您可以到下载融云 SDK。融云 SDK 各部分功能以插件化的形式独立提供,开发者可以根据自己的需要,自由组合下载。各组件的功能如下:
支持的 CPU 架构
融云 IM 界面组件
融云 IM 通讯能力库
armeabi, armeabi-v7a, arm64-v8a, x86
融云音视频界面组件
融云音视频核心组件
armeabi-v7a, x86
LocationLib
融云位置相关库
融云第三方推送库
armeabi, armeabi-v7a, arm64-v8a, x86
融云红包相关组件
您要进行应用开发之前,需要先在融云开发者平台创建应用。如果您已经注册了融云开发者帐号,请前往创建应用。
您创建完应用后,首先需要了解的是 App Key / Secret,它们是融云 SDK 连接服务器所必须的标识,每一个 App 对应一套 App Key / Secret。针对开发者的生产环境和开发环境,我们提供两套 App Key / Secret,两套环境的功能完全一致。您在应用最终上线前,使用开发环境即可。
App Key / Secret 位置
获取 Token
Token 称为用户令牌,App Key 是您的 App 的唯一标识,Token 则是您 App 上的每一个用户的身份授权象征。您可以通过提交 userId 等信息来获得一个该用户对应的 Token,并使用这个 Token 作为该用户的唯一身份凭证与其他用户进行通信。
Token 的主要作用是身份授权和安全,因此不能通过客户端直接访问融云服务器获取 Token,您必须通过 Server API 从融云服务器
获取 Token 返回给您的 App,并在之后连接时使用。详细描述请参考 中的用户服务和获取 Token 方法小节。
userId : 每一个用户对应一个 userId,这个 userId 是您维护的,所以您可以直接赋值,两个您的的用户通信,对于融云来说就是两个 userId 间通讯。
name : 用户的显示名称,用来在 Push 推送时,或者您没有传入用户信息时,默认显示的用户名称。
portraitUri : 用户头像,用来当您没有传入用户信息时作为默认头像,如果图片不存在,IMKit 会显示默认头像。
通过 API 调试,您可以得到一个 Token 返回值。您就可以直接使用这个 Token 为这位用户进行发送和接受消息。
在您集成融云 SDK 前环境要求如下:
Android SDK Build-tools 请升级到 21 及以上版本。
JAVA 编译版本 JDK 1.7 及以上版本。
使用 IMKit 需要 Android Support V4 21 及以上版本。
我们建议初次集成 SDK 的用户,先创建一个空项目来集成融云的 SDK,然后再考虑加入您的工程。
以 Module 形式导入前面下载的融云 SDK 里面的各个组件。
打开您的工程, File -& New -& Import Module
打开您从官网下载的融云 SDK,选择 IMLib。如图:
根据您的需要,以同样的步骤导入SDK里的其它组件: IMKit, CallKit, CallLib, RedPacket。
将 PushLib 中的 jar 包 和 pushDaemon -& libs 目录下应用所支持平台的 so 拷贝到您应用的 libs 目录下,另外还需要将 pushDaemon -& executable 目录下各平台的可执行文件 push_daemon 拷贝到您应用 Module 的 assets 目录下。如图:
注意 : 放置 so 的文件夹位置需要和您 build.gradle 文件中配置的 jni 目录一致。
将 LocationLib 里的 jar 包拷贝到您应用的 libs 目录下(如果不需要位置功能,可跳过此步骤)。
音视频通话组件 CallLib 仅支持 armeabi-v7a 和 x86 架构 CPU (),如果您使用了我们的音视频通话功能,注意需要把 IMLib 和 PushLib 组件中其它 CPU 架构的 so 删除。或者您也可以在应用的 build.gradle 文件中增加如下配置来过滤 so :
defaultConfig {
applicationId &XXX&
abiFilters &armeabi-v7a&, &x86&
打开应用的 build.gradle,在 dependencies 中添加相应模块的依赖。如图:
打开 IMLib Module 的 AndroidManifest.xml 文件,把 meta-data RONG_CLOUD_APP_KEY 的值修改为您自己的 AppKey. 如图:
&meta-data
android:name=&RONG_CLOUD_APP_KEY&
android:value=&您的应用 AppKey& /&
打开应用的 App Module 的 AndroidManifest.xml 文件, 把从高德官网获取的 AppKey 添加到 meta-data 里 (如果您不使用位置功能,可跳过此步骤)。
&meta-data
android:name=&com.amap.api.v2.apikey&
android:value=&高德地图的 AppKey& /&
在应用的 App Module 的 AndroidManifest.xml 文件中,添加 FileProvider 相关配置,修改 android:authorities 为 “您的应用的包名称.FileProvider”。
android:name=&android.support.v4.content.FileProvider&
android:authorities=&您的应用包名.FileProvider&
android:exported=&false&
android:grantUriPermissions=&true&&
&meta-data
android:name=&android.support.FILE_PROVIDER_PATHS&
android:resource=&@xml/rc_file_path& /&
&/provider&
在整个应用程序全局,您只需要调用一次 init 方法。对于快速集成,我们建议您在 App 主进程初始化,您只需要实现一句函数,以下为 代码示例:
public class App extends Application {
public void onCreate() {
super.onCreate();
RongIM.init(this);
关于初始化的注意事项
融云的 SDK 使用了跨进程机制来进行通信,运行后您的 App 后您会发现以下三个进程: 1、您的应用进程;2、您的应用进程: ipc,这是融云的通信进程;3、io.rong.push,这是融云的推送进程。
连接服务器
连接服务器前,确认已通过融云 Server API 接口。
调用 connect() 方法连接融云服务器,该方法在整个应用的生命周期里只需要调用一次,且必须在主进程调用。如果连接失败,SDK 会自动启动重连机制,进行最多 10 次重连,分别是 1、2、4、8、16、32、64、128、256、512 秒后。如果仍然没有连接成功,还会在检测网络状态变化时再次重连。您不需要做额外的重连操作。
注意:当应用被杀死后,接受到推送通知,点击通知拉起应用时,此时应用被重新唤起,属于新的生命周期,所以需要再次调用 connect() 方法进行连接。
* &p&连接服务器,在整个应用程序全局,只需要调用一次,需在 {@link #init(Context)} 之后调用。&/p&
* &p&如果调用此接口遇到连接失败,SDK 会自动启动重连机制进行最多10次重连,分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。
* 在这之后如果仍没有连接成功,还会在当检测到设备网络状态变化时再次进行重连。&/p&
* @param token
从服务端获取的用户身份令牌(Token)。
* @param callback 连接回调。
* @return RongIM
客户端核心类的实例。
private void connect(String token) {
if (getApplicationInfo().packageName.equals(App.getCurProcessName(getApplicationContext()))) {
RongIM.connect(token, new RongIMClient.ConnectCallback() {
* Token 错误。可以从下面两点检查 1.
Token 是否过期,如果过期您需要向 App Server 重新请求一个新的 Token
token 对应的 appKey 和工程里设置的 appKey 是否一致
public void onTokenIncorrect() {
* 连接融云成功
* @param userid 当前 token 对应的用户 id
public void onSuccess(String userid) {
Log.d(&LoginActivity&, &--onSuccess& + userid);
startActivity(new Intent(LoginActivity.this, MainActivity.class));
* 连接融云失败
* @param errorCode 错误码,可到官网 查看错误码对应的注释
public void onError(RongIMClient.ErrorCode errorCode) {
配置会话列表
融云 IMKit SDK 使用了 Fragment 作为会话列表和会话界面的组件,其优点是支持各种嵌套方式,更符合您的定制化需求。
下面说明如何在 Activity 里以静态方式加载融云 Fragment.
配置布局文件
这是您的会话列表 Activity 对应的布局文件:conversationlist.xml。注意 android:name 固定为融云的 ConversationListFragment。
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&http://schemas.android.com/apk/res/android&
android:orientation=&vertical& android:layout_width=&match_parent&
android:layout_height=&match_parent&&
android:id=&@+id/conversationlist&
android:name=&io.rong.imkit.fragment.ConversationListFragment&
android:layout_width=&match_parent&
android:layout_height=&match_parent& /&
&/LinearLayout&
新建 Activity
public class ConversationListActivity extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.conversationlist);
配置 intent-filter:
融云 SDK 是通过隐式调用的方式来实现界面跳转的。因此您需要在 AndroidManifest.xml 中,您的会话列表 Activity 下面配置 intent-filter,其中,android:host 是您应用的包名,需要手动修改,其他请保持不变。
&!--会话列表--&
android:name=&io.rong.fast.activity.ConversationListActivity&
android:screenOrientation=&portrait&
android:windowSoftInputMode=&stateHidden|adjustResize&&
&intent-filter&
&action android:name=&android.intent.action.VIEW& /&
&category android:name=&android.intent.category.DEFAULT& /&
android:host=&io.rong.fast&
android:pathPrefix=&/conversationlist&
android:scheme=&rong& /&
&/intent-filter&
&/activity&
配置聚合会话列表
融云支持在会话列表页面自定义某种类型的会话以聚合形式展示,比如,定义所有私聊会话聚合显示,则在会话列表页所有私聊会话聚合显示为“我的私人会话”,点击“我的私人会话”,会进入所有私聊会话的展示页面,这个页面即为聚合会话列表,如图:
聚合会话列表
如果您的应用定义了聚合会话,请按照下面的说明进行相应配置,否则可以直接跳过此步骤。
自定义聚合会话列表请参考。
配置布局文件
这是您的聚合会话列表 Activity 对应的布局文件:subconversationlist.xml。 注意 android:name 固定为融云的 SubConversationListFragment。
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&http://schemas.android.com/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&&
android:id=&@+id/subconversationlist&
android:name=&io.rong.imkit.fragment.SubConversationListFragment&
android:layout_width=&match_parent&
android:layout_height=&match_parent& /&
&/LinearLayout&
新建 Activity :
public class SubConversationListActivtiy extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.subconversationlist);
配置 intent-filter
在 AndroidManifest.xml 中, 聚合会话 Activity 下面配置 intent-filter。 注意请修改 android:host 为您应用的包名,其他保持不变。
&!--聚合会话列表--&
android:name=&io.rong.fast.activity.SubConversationListActivtiy&
android:screenOrientation=&portrait&
android:windowSoftInputMode=&stateHidden|adjustResize&&
&intent-filter&
&action android:name=&android.intent.action.VIEW& /&
&category android:name=&android.intent.category.DEFAULT& /&
android:host=&io.rong.fast&
android:pathPrefix=&/subconversationlist&
android:scheme=&rong& /&
&/intent-filter&
&/activity&
配置会话界面
会话 Fragment 跟会话列表是完全一致的,您可以用同样的方式快速的配置好。
配置布局文件
这是您的会话 Activity 对应的布局文件 conversation.xml,注意 android:name 固定为融云的 ConversationFragment。
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&http://schemas.android.com/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical&&
android:id=&@+id/conversation&
android:name=&io.rong.imkit.fragment.ConversationFragment&
android:layout_width=&match_parent&
android:layout_height=&match_parent& /&
&/LinearLayout&
新建 Activity
public class ConversationActivity extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.conversation);
配置 intent-filter
在 AndroidManifest.xml 中,会话 Activity 下面配置 intent-filter。 注意请修改 android:host 为您应用的包名,其他保持不变。
&!--会话界面--&
android:name=&io.rong.fast.activity.ConversationActivity&
android:screenOrientation=&portrait&
android:windowSoftInputMode=&stateHidden|adjustResize&&
&intent-filter&
&action android:name=&android.intent.action.VIEW& /&
&category android:name=&android.intent.category.DEFAULT& /&
android:host=&io.rong.fast&
android:pathPrefix=&/conversation/&
android:scheme=&rong& /&
&/intent-filter&
&/activity&
会话列表及界面实现的视频教程
视频讲解会话界面、会话列表的配置以及 Fragment 的嵌套和 ViewPager+Fragment 的使用。
注:在按钮点击事件下可通过调用 RongIM.getInstance().startConversationList(); 去唤起会话列表。
会话界面 Title 配置的视频教程
此视频讲解了会话界面的 Title 如何编写,以及怎样通过 intent 的方式拿到 targetId 、昵称、会话类型等。
完成以上配置后,即可启动会话及会话列表界面,启动界面操作必须在执行初始化 SDK 方法 init 及连接融云服务器 connect 之后进行,示例如下:
* &p&启动会话界面。&/p&
* &p&使用时,可以传入多种会话类型 {@link io.rong.imlib.model.Conversation.ConversationType} 对应不同的会话类型,开启不同的会话界面。
* 如果传入的是 {@link io.rong.imlib.model.Conversation.ConversationType#CHATROOM},sdk 会默认调用
* {@link RongIMClient#joinChatRoom(String, int, RongIMClient.OperationCallback)} 加入聊天室。
* 如果你的逻辑是,只允许加入已存在的聊天室,请使用接口 {@link #startChatRoomChat(Context, String, boolean)} 并且第三个参数为 true&/p&
* @param context
应用上下文。
* @param conversationType 会话类型。
* @param targetId
根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
public void startConversation(Context context, Conversation.ConversationType conversationType, String targetId, String title)
* 启动会话列表界面。
* @param context
应用上下文。
* @param supportedConversation 定义会话列表支持显示的会话类型,及对应的会话类型是否聚合显示。
例如:supportedConversation.put(Conversation.ConversationType.PRIVATE.getName(), false) 非聚合式显示 private 类型的会话。
public void startConversationList(Context context, Map&String, Boolean& supportedConversation)
* 启动聚合后的某类型的会话列表。&br& 例如:如果设置了单聊会话为聚合,则通过该方法可以打开包含所有的单聊会话的列表。
* @param context
应用上下文。
* @param conversationType 会话类型。
public void startSubConversationList(Context context, Conversation.ConversationType conversationType)
自定义广播接收器
当您的应用处于后台运行或者和融云服务器 disconnect() 的时候,如果收到消息,融云 SDK 会以通知形式提醒您。所以您还需要自定义一个继承融云 PushMessageReceiver 的广播接收器,用来接收提醒通知。如图:
public class SealNotificationReceiver extends PushMessageReceiver {
public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
// 返回 false, 会弹出融云 SDK 默认通知; 返回 true, 融云 SDK 不会弹通知, 通知需要由您自定义。
public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
// 返回 false, 会走融云 SDK 默认处理逻辑, 即点击该通知会打开会话列表或会话界面; 返回 true, 则由您自定义处理逻辑。
融云 SDK 提供以下两种断开连接的方法:
如果您想在断开和融云的连接后,有新消息时,仍然能够收到推送通知,调用 disconnect() 方法。
* &p&断开与融云服务器的连接。当调用此接口断开连接后,仍然可以接收 Push 消息。&/p&
* &p&若想断开连接后不接受 Push 消息,可以调用{@link #logout()}&/p&
public void disconnect()
如果断开连接后,有新消息时,不想收到任何推送通知,调用 logout() 方法。
* &p&断开与融云服务器的连接,并且不再接收 Push 消息。&/p&
* &p&若想断开连接后仍然接受 Push 消息,可以调用 {@link #disconnect()}&/p&
public void logout()
通过以上步骤,您即完成了融云 SDK 的集成。
API 调用说明
如果您基于 IMKit SDK 进行开发,那在初始化 SDK 之后,请通过 RongIM.getInstance() 方法获取实例,然后调用相应的 api 方法。示例:
RongIM.getInstance().setOnReceiveMessageListener(new OnReceiveMessageListener())
不要使用 RongIMClient 实例去调用相关接口,否则会导致 UI 显示异常。
设计原理说明:
融云认为,每一个设计良好且功能健全的 App 都应该能够在本地获取、缓存并更新用户信息。所以,融云不维护用户基本信息(用户 Id、昵称、头像)。此外,App 提供用户信息也避免了由于缓存导致的用户信息更新不及时,App 中不同界面上的用户信息不统一(比如:一部分 App 从 App 服务器上获取并显示,一部分由融云服务器获取并显示),能够获得最佳的用户体验。
融云提供了两种方式从 App 的数据源显示用户昵称和头像。
1、设置用户信息提供者:
调用 RongIM.setUserInfoProvider 方法设置 UserInfoProvider。用户信息提供者采用 Provider 模式,即您提供给融云的 IMKit 一个 UserInfoProvider,当融云的 IMKit 需要使用用户信息的时候,调用您传入的 UserInfoProvider.getUserInfo 方法,向您获取用户信息。所以您在 UserInfoProvider.getUserInfo 方法中,需要根据传入的 userId 参数,向我们返回对应的用户信息。
App -& SDK: 设置并实现用户信息提供者\nRongIM.setUserInfoProvider(provider)
SDK UI -& SDK: 界面显示用户信息\n(如聊天或者会话列表)
SDK -& App: 调用第一步实现的 provider.getUserInfo\n方法,传入 userId
App -& App Server: 获取指定 userId 的用户信息
App Server --& App: 返回指定 userId 的用户信息
App -& App: 本地缓存该用户信息,以备\n下次调用
App --& SDK: 返回指定 userId 的用户信息
SDK --& SDK UI: 返回指定 userId 的用户信息
* 设置用户信息的提供者,供 RongIM 调用获取用户名称和头像信息。
* @param userInfoProvider 用户信息提供者。
* @param isCacheUserInfo
设置是否由 IMKit 来缓存用户信息。&br&
如果 App 提供的 UserInfoProvider
每次都需要通过网络请求用户数据,而不是将用户数据缓存到本地内存,会影响用户信息的加载速度;&br&
此时最好将本参数设置为 true,由 IMKit 将用户信息缓存到本地内存中。
* @see UserInfoProvider
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {
public UserInfo getUserInfo(String userId) {
return findUserById(userId);//根据 userId 去你的用户系统里查询对应的用户信息返回给融云 SDK。
很多时候 getUserInfo 这个方法会去 App 服务器异步获取用户信息,不能实时返回用户信息。这种情况下,请在成功获取到用户信息的异步回调中使用下面方法来刷新信息。
刷新用户信息:
* 刷新用户缓存数据。
* @param userInfo 需要更新的用户缓存数据。
RongIM.getInstance().refreshUserInfoCache(new UserInfo(&userId&, &啊明&, Uri.parse(&http://rongcloud-web.qiniudn.com/docs_demo_rongcloud_logo.png&)));
刷新群组信息
* 刷新群组缓存数据。
* @param group 需要更新的群组缓存数据。
public void refreshGroupInfoCache(Group group)
刷新讨论组信息
* 刷新讨论组缓存数据,可用于讨论组修改名称后刷新讨论组内其他人员的缓存数据。
* @param discussion 需要更新的讨论组缓存数据。
public void refreshDiscussionCache(Discussion discussion)
2、使用消息携带用户信息
当 App 本身没有用户系统或者因为某些原因不方便使用上述用户信息提供者的时候,可以使用消息携带用户信息来发送给消息接收方。
请注意这种方式不要和用户信息提供者混用。并且,这种方式会在每条发送的消息里都携带当前登陆用户的信息,增加消息的长度。
首先,需要使用 setCurrentUserInfo 方法来设置当前的用户信息。
* 设置当前用户信息,
* @param userInfo 当前用户信息
RongIM.getInstance().setCurrentUserInfo(userInfo);
接下来,在 init 之后调用下面方法设置消息携带用户信息。
* 设置消息体内是否携带用户信息。
* @param state 是否携带用户信息,true 携带,false 不携带。
RongIM.getInstance().setMessageAttachedUserInfo(true);
接收方在接收到消息后,SDK 会自动从消息中取出用户信息,并显示到 UI 上。
常见问题:
以下视频主要讲解融云 IMKit 中用户信息的实现包括头像及昵称。
单聊是最基本的聊天界面,提供文字、表情、语音片段、图片、实时音视频等多种输入内容,解决 App 内用户的沟通瓶颈。会话关系由融云负责建立并保持,退出聊天界面或者离线后可以收到推送通知。
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
打开单聊窗口:
* 启动单聊界面。
* @param context
应用上下文。
* @param targetUserId 要与之聊天的用户 Id。
* @param title
聊天的标题,开发者需要在聊天界面通过 intent.getData().getQueryParameter(&title&)
获取该值, 再手动设置为聊天界面的标题。
RongIM.getInstance().startPrivateChat(getActivity(), &9527&, &标题&);
常见问题:
讨论组业务的描述,请参见中的说明。
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
打开讨论组聊天窗口:
* 启动已经创建的讨论组聊天界面。
* @param context
应用上下文。
* @param targetDiscussionId 要启动的讨论组 Id。
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
RongIM.getInstance().startDiscussionChat(getActivity(), &9527&, &标题&);
创建讨论组会话并进入会话界面:
* 创建讨论组会话并进入会话界面。
* 讨论组创建成功后,会返回讨论组 id。
* @param context 应用上下文。
* @param targetUserIds 要与之聊天的讨论组用户 Id 列表。
* @param title 聊天的标题,如果传入空值,则默认显示与之聊天的用户名称。
* @param callback 讨论组回调,成功时,返回讨论组 id。
public void createDiscussionChat(final Context context, final List&String& targetUserIds, final String title, final RongIMClient.CreateDiscussionCallback callback) {})
创建讨论组
* 创建讨论组。
* @param name
讨论组名称,如:当前所有成员的名字的组合。
* @param userIdList 讨论组成员 Id 列表。
* @param callback
创建讨论组成功后的回调。
public void createDiscussion(final String name, final List&String& userIdList, final RongIMClient.CreateDiscussionCallback callback)
添加讨论组成员:
同一个用户最多可加入 500 个讨论组。
ArrayList&String& userIds = new ArrayList&String&();
userIds.add(&101&);//增加 userId。
userIds.add(&102&);//增加 userId。
userIds.add(&103&);//增加 userId。
* 添加一名或者一组用户加入讨论组。
* @param discussionId 讨论组 Id。
* @param userIdList
邀请的用户 Id 列表。
* @param callback
执行操作的回调。
RongIM.getInstance().addMemberToDiscussion(&9527&, userIds, new RongIMClient.OperationCallback() {
public void onSuccess() {
public void onError(RongIMClient.ErrorCode errorCode) {
移除讨论组成员:
* 供创建者将某用户移出讨论组。
* 移出自己或者调用者非讨论组创建者将产生 {@link RongIMClient.ErrorCode#UNKNOWN} 错误。
* @param discussionId 讨论组 Id。
* @param userId
* @param callback
执行操作的回调。
RongIM.getInstance().removeMemberFromDiscussion(&discussionId_9527&, &user_9527&, new RongIMClient.OperationCallback() {
public void onSuccess() {
public void onError(RongIMClient.ErrorCode errorCode) {
讨论组人数上限设置:
讨论组人数在服务端有上限限制,为 500 人,客户端根据具体的业务需求,可以通过配置文件配置讨论组人数上限,请在 res/values/rc_config.xml 文件中修改, xml 文件如下:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&integer name=&discussion_member_max_count&&50&/integer&
&/resources&
群组业务的描述,请参见中的说明。
群组信息与群成员信息是由 App 自己提供并进行维护管理,融云只是同步群组关系数据,并不保存群组的具体信息,融云会根据开发者同步的群组数据,计算群组的成员信息并群发消息。所以,当界面组件创建会话需要显示群组信息时,需要向 App 获取。App 需要设置一个群组信息提供者给 IMKit,以便 IMKit 读取好友关系。
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
启动群组聊天界面:
* 启动群组聊天界面。
* @param context
应用上下文。
* @param targetGroupId 要聊天的群组 Id。
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
RongIM.getInstance().startGroupChat(getActivity(), &9527&, &标题&);
客户端的所有群组操作都需要请求您的 App Server,
您的 App Server 可以根据自己的逻辑进行管理和控制,然后通过 Server API 接口进行群组操作,并将结果返回给客户端。
以下展示了客户端进行群组操作的流程:
App -& App Server: App 向自己应用服务器发起创建群组请求。
App Server -& RongCloud Server: 授权成功后,在融云服务端同步创建群组。\n /group/create
RongCloud Server -& App Server: 创建成功,返回状态。
App Server -& App: 创建成功,可以发送群组信息。
App -& App Server: App 向自己应用服务器发起加入群组请求。
App Server -& RongCloud Server: 授权成功后,调用融云服务端加入群组接口。\n /group/join
RongCloud Server -& App Server: 加入成功,返回状态。
App Server -& App: 加入成功,用户可在群组中发送信息。
App -& App Server: App 向自己应用服务器发起退出群组请求。
App Server -& RongCloud Server: 授权成功后,调用融云服务端退出群组接口。\n /group/quit
RongCloud Server -& App Server: 退出成功,返回状态。
App Server -& App: 退出群组,用户不会再收到此群组信息。
App -& App Server: App 向自己应用服务器发起解散群组请求。
App Server -& RongCloud Server: 授权成功后,调用融云服务端解散群组接口。\n /group/dismiss
RongCloud Server -& App Server: 解散成功,返回状态。
App Server -& App: 成功解散群组。
设置群组信息
App -& App Server: App 向自己应用服务器发起设置群组信息请求。
App Server -& RongCloud Server: 授权成功后,调用融云服务端设置群组信息接口。\n /group/refresh
RongCloud Server -& App Server: 设置成功,返回状态。
App Server -& App: 群组信息设置成功。
获取群组成员列表
App -& App Server: App 向自己应用服务器发起查询群组成员请求。
App Server -& App: 成功,返回成员信息。
获取群组列表
App -& RongCloud Server: 连接融云服务器。 connect
RongCloud Server -& App: 连接成功,返回状态信息。
App --& App Server: 请求获取群组列表
App Server -& RongCloud Server: 如有变更,需要向融云服务端同步群组信息。
RongCloud Server -& App Server: 成功,返回状态信息。
App Server --& App: 成功,返回群组列表。
聊天室业务的描述,请参见中的说明。
聊天室与群组最大的不同在于,聊天室的消息没有 Push 通知,也没有成员的概念。想参与聊天室聊天,接收聊天室消息,加入聊天室即可;不参与聊天室聊天,不接收消息,退出聊天室即可。IMKit 组件中已经内置了加入和退出聊天室的接口调用,您直接启动即可:
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
启动聊天室界面:
* &p&启动聊天室会话。&/p&
* &p&设置参数 createIfNotExist 为 true,对应到 kit 中调用的接口是
* {@link RongIMClient#joinChatRoom(String, int, RongIMClient.OperationCallback)}.
* 如果聊天室不存在,则自动创建并加入,如果回调失败,则弹出 warning。&/p&
* &p&设置参数 createIfNotExist 为 false,对应到 kit 中调用的接口是
* {@link RongIMClient#joinExistChatRoom(String, int, RongIMClient.OperationCallback)}.
* 如果聊天室不存在,则返回错误 {@link io.rong.imlib.RongIMClient.ErrorCode#RC_CHATROOM_NOT_EXIST},并且会话界面会弹出 warning.
* @param context
应用上下文。
* @param chatRoomId
聊天室 id。
* @param createIfNotExist 如果聊天室不存在,是否创建。
public void startChatRoomChat(Context context, String chatRoomId, boolean createIfNotExist);
加入聊天室
加入聊天室,如果聊天室不存在,则创建聊天室并加入;如果已经存在,则直接加入。
* 加入聊天室。
* &p&如果聊天室不存在,sdk 会创建聊天室并加入,如果已存在,则直接加入&/p&
* &p&加入聊天室时,可以选择拉取聊天室消息数目。&/p&
* @param chatroomId
聊天室 Id。
* @param defMessageCount 进入聊天室拉取消息数目,-1 时不拉取任何消息,0 时拉取 10 条消息,最多只能拉取 50 条。
* @param callback
状态回调。
public void joinChatRoom(final String chatroomId, final int defMessageCount, final RongIMClient.OperationCallback callback)
加入已经存在的聊天室
* 加入已存在的聊天室。
* &p&如果聊天室不存在,则加入失败&/p&
* &p&加入聊天室时,可以选择拉取聊天室消息数目。&/p&
* @param chatroomId
聊天室 Id。
* @param defMessageCount 进入聊天室拉取消息数目,-1 时不拉取任何消息,0 时拉取 10 条消息,最多只能拉取 50 条。
* @param callback
状态回调。
public void joinExistChatRoom(final String chatroomId, final int defMessageCount, final RongIMClient.OperationCallback callback)
聊天室拉取消息数设置:
进入聊天室时默认拉取消息数为 10 条,根据需求可通过配置文件修改拉取消息条数,建议拉取消息数不超过 50 条,请在 res/values/rc_config.xml 文件中修改,为 -1 表示不获取任何历史消息,0 表示不特殊设置而使用 SDK 默认的设置(默认为获取10条),最大值为50。 xml 文件如下:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&integer name=&rc_chatroom_first_pull_message_count&&10&/integer&
&/resources&
如您在使用 IMLib 开发时注意,因聊天室没有成员关系,需要在每次显示聊天室聊天界面之前,执行加入聊天室的操作,并在退出聊天室聊天界面之后执行退出聊天室的操作。否则,您的 App 将消耗不必要的流量(不退出聊天室将会持续接收来自该聊天室的消息)。
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
打开系统会话聊天界面:
* 启动系统会话聊天界面。
* @param context
应用上下文。
* @param conversationType 开启会话类型。
* @param targetId
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
RongIM.getInstance().startConversation(getActivity(), Conversation.ConversationType.SYSTEM, &9527&, &标题&);
系统会话消息由应用服务端发送,客户端只能接收消息,不能进行回复。
IMKit 中提供封装好的客服功能和 UI 界面,轻松的几行代码就能完成集成,为应用中用户提供优质的客服服务。
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
开启客服服务,并获取 客服 ID。
打开客服聊天界面:
下面代码示例中参数 csInfo 目前未使用,可以传 null,以后会启用。客服后台显示的用户信息是获取 Token 时上传的用户信息。
//首先需要构造使用客服者的用户信息
CSCustomServiceInfo.Builder csBuilder = new CSCustomServiceInfo.Builder();
CSCustomServiceInfo csInfo = csBuilder.nickName(&融云&).build();
* 启动客户服聊天界面。
* @param context
应用上下文。
* @param customerServiceId 要与之聊天的客服 Id。
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
* @param customServiceInfo 当前使用客服者的用户信息。{@link io.rong.imlib.model.CSCustomServiceInfo}
RongIM.getInstance().startCustomerServiceChat(getActivity(), id, &在线客服&,csInfo);
使用我们的客服需要集成 ConversationFragment 到 Activity 中 ,当您退出这个 Activity 的时候调用如下代码:
public void onBackPressed() {
ConversationFragment fragment = (ConversationFragment) getSupportFragmentManager().findFragmentById(R.id.conversation);
if(!fragment.onBackPressed()) {
当触发 onKeyDown 事件的时候,做以下处理:
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
目的就是为了让我们的 ConversationFragment 捕捉到 back 事件,然后弹出 Dialog。
退出客服界面是否关闭客服设置
在 rc_config.xml 配置文件中,设置退出客服界面后是否关闭客服功能,默认为 true 退出后关闭客服不接收客服消息,为 false 时退出客服界面后不关闭客服,还能正常接收客服消息。
&resources&
&!-- 退出客服页面是否关闭客服 --&
&bool name=&rc_stop_custom_service_when_quit&&true&/bool&
&/resources&
客服界面提示窗自定义
客服界面的提示窗口,首先集成一个自定义的类继承自 ConversationFragment, 然后在自定义类中重写 onCustomServiceWarning() 方法,如下图:
机器人模式的评价和人工模式的评价,可以通过在自定义类中重写 onCustomServiceEvaluation() 方法来自定义,如下图:
融云公众服务是为应用开发者和公众帐号运营者提供的连接服务产品,通过融云公众服务,App 可以具备为自己的用户提供公众帐号服务的能力和资源。
公众服务包括:应用公众服务和公众服务平台。
应用公众服务:是为应用开发者提供的 App 内建公众服务能力,通过在融云开发者站点创建 App 公众号,实现应用内的公众服务。
公众服务平台:是在应用开发者和公众帐号运营者之间建立的对接平台,应用开发者可以通过平台引入公众服务资源,帮助 App 快速覆盖用户需求,公众帐号持有者通过平台可以有机会向所有集成融云 SDK 的 App 提供服务,进而获得更加精准更加丰富的受众渠道。
开发者可在
的公众服务模块中,通过添加公众服务或应用公众服务中的公众号到自己的应用中。
IMKit 组件中已经内置了订阅和取消订阅公众号的接口调用,您直接启动即可:
前提条件:
RongIM.init(this),接口已经执行。
RongIM.connect(....),接口已经执行且 onSuccess() 被回调。
会话 Activity 已经在 AndroidManifest.xml 文件中,配置了对应的 intent-filter,详见。
打开应用公众服务会话界面:
* 启动应用公众服务会话界面。
* @param context
应用上下文。
* @param conversationType 开启会话类型。
* @param targetId
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
RongIM.getInstance().startConversation(getActivity(), Conversation.ConversationType.APP_PUBLIC_SERVICE, &9527&, &公众帐号标题&);
打开公众服务号会话界面:
* 启动公众服务号会话界面。
* @param context
应用上下文。
* @param conversationType 开启会话类型。
* @param targetId
* @param title
聊天的标题,开发者可以在聊天界面通过 intent.getData().getQueryParameter(&title&) 获取该值, 再手动设置为标题。
RongIM.getInstance().startConversation(getActivity(), Conversation.ConversationType.PUBLIC_SERVICE, &9527&, &公众帐号标题&);
打开应用公众服务信息界面:
* 启动应用公众服务信息界面。
* @param context
应用上下文。
* @param conversationType 会话类型。
* @param targetId
RongIM.getInstance().startPublicServiceProfile(getActivity(), Conversation.ConversationType.APP_PUBLIC_SERVICE, &9527&);
打开公共服务号信息界面:
* 启动公共服务号信息界面。
* @param context
应用上下文。
* @param conversationType 会话类型。
* @param targetId
RongIM.getInstance().startPublicServiceProfile(getActivity(), Conversation.ConversationType.PUBLIC_SERVICE, &9527&);
搜索公众号
通过 searchPublicService 或 searchPublicServiceByType 方法搜索已经添加的公众号列表,可以按关键字精确匹配或模糊匹配方式进行搜索。
* 搜索全部公众服务。
* @param searchType
搜索类型枚举。
* @param keywords
搜索关键字。
RongIM.getInstance().searchPublicService(RongIMClient.SearchType.EXACT, keywords, new RongIMClient.SearchPublicServiceCallback() {
public void onError(RongIMClient.ErrorCode e) {
//错误回调处理
public void onSuccess(PublicServiceProfileList publicServiceProfileList) {
//成功回调处理
* 按公众服务类型搜索公众服务。
* @param conversationType 会话类型。
* @param searchType
搜索类型枚举。
* @param keywords
搜索关键字。
RongIM.getInstance().searchPublicServicebyType(Conversation.PublicServiceType.PUBLIC_SERVICE, RongIMClient.SearchType.EXACT, keywords,
new RongIMClient.SearchPublicServiceCallback() {
public void onError(RongIMClient.ErrorCode e) {
//错误回调处理
public void onSuccess(PublicServiceProfileList publicServiceProfileList) {
//成功回调处理
获取己关注公共账号列表:
在应用中需要展示已关注公共账号列表时,可通过 getPublicServiceList 方法获取己关注公共账号列表信息。
RongIM.getInstance().getPublicServiceList(new RongIMClient.SearchPublicServiceCallback() {
public void onSuccess(PublicServiceProfileList publicServiceProfileList) {
//成功回调处理
public void onError(RongIMClient.ErrorCode e) {
//错误回调处理
获取某公众号信息
* 按公众服务类型搜索公众服务。
* @param publicServiceType
公众服务类型。
* @param publicServiceId
公众号 Id。
RongIM.getInstance().getPublicServiceProfile(Conversation.PublicServiceType.PUBLIC_SERVICE, publicServiceId, new RongIMClient.ResultCallback&PublicServiceProfile&() {
public void onSuccess(PublicServiceProfile profile) {
//成功后返回公众号信息
public void onError(RongIMClient.ErrorCode e) {
//错误回调处理
保存草稿至某一会话
* 根据消息类型,targetId 保存某一会话的文字消息草稿。用于暂存用户输入但未发送的消息。
* @param conversationType 会话类型。
* @param targetId
目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
* @param content
草稿的文字内容。
* @param callback
是否保存成功的回调。
public void saveTextMessageDraft(Conversation.ConversationType conversationType, String targetId, final String content, final ResultCallback&Boolean& callback)
获取某会话里的草稿信息
* 根据消息类型,targetId 获取某一会话的文字消息草稿。用于获取用户输入但未发送的暂存消息。
* @param conversationType 会话类型。
* @param targetId
目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
* @param callback
获取草稿文字内容的回调。
public void getTextMessageDraft(final Conversation.ConversationType conversationType, final String targetId, final ResultCallback&String& callback)
注:这些草稿信息仅存储于本地数据库中,不会上传服务器。
文本消息发送
发送文本消息如下:
// 构造 TextMessage 实例
TextMessage myTextMessage = TextMessage.obtain(&我是消息内容&);
/* 生成 Message 对象。
* &7127& 为目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
* Conversation.ConversationType.PRIVATE 为私聊会话类型,根据需要,也可以传入其它会话类型,如群组,讨论组等。
Message myMessage = Message.obtain(&7127&, Conversation.ConversationType.PRIVATE, myTextMessage);
* &p&发送消息。
* 通过 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}
* 中的方法回调发送的消息状态及消息体。&/p&
* @param message
将要发送的消息体。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
RongIM.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
public void onAttached(Message message) {
//消息本地数据库存储成功的回调
public void onSuccess(Message message) {
//消息通过网络发送成功的回调
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
//消息发送失败的回调
位置消息发送
构造位置消息:
* 生成LocationMessage对象。
* @param lat
* @param lng
* @param poi
* @param imgUri 地图缩率图地址。
* @return LocationMessage实例对象。
public static LocationMessage obtain(double lat, double lng, String poi, Uri imgUri)
根据位置消息生成 Message 实例,如下:
LocationMessage locationMessage = LocationMessage.obtain(lat, lng, poi, thumb);
io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain(mTargetId, mConversationType, locationMessage);
发送位置消息:
* &p&发送地理位置消息。并同时更新界面。&/p&
* &p&发送前构造 {@link Message} 消息实体,消息实体中的 content 必须为 {@link LocationMessage}, 否则返回失败。&/p&
* &p&其中的缩略图地址 scheme 只支持 file:// 和 http:// 其他暂不支持。&/p&
* @param message
消息实体。
* @param pushContent
当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param sendMessageCallback 发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
public void sendLocationMessage(Message message, String pushContent, final String pushData, final IRongCallback.ISendMessageCallback sendMessageCallback)
融云 SDK 默认使用的是高德地图,您也可以基于其它第三方实现位置功能,请参考。
图片消息发送
默认图片消息发送
获取 ImageMessage 实例
* 生成ImageMessage对象。
* @param thumUri
缩略图地址。
* @param localUri 大图地址。
* @param isFull 是否发送原图。
* @return ImageMessage对象实例。
public static ImageMessage obtain(Uri thumUri, Uri localUri, boolean isFull)
发送图片消息
* &p&根据会话类型,发送图片消息。&/p&
* @param type
会话类型。
* @param targetId
目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
* @param content
消息内容,例如 {@link TextMessage}, {@link ImageMessage}。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调。
RongIM.getInstance().sendImageMessage(Conversation.ConversationType.PRIVATE, &9517&, imgMsg, null, null, new RongIMClient.SendImageMessageCallback() {
public void onAttached(Message message) {
//保存数据库成功
public void onError(Message message, RongIMClient.ErrorCode code) {
//发送失败
public void onSuccess(Message message) {
//发送成功
public void onProgress(Message message, int progress) {
//发送进度
注:图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器,然后将云存储上的大图地址放入消息体中。
融云 SDK 中默认上传文件存储有效期为 6 个月,不支持文件迁移。
发送图片消息并且上传到自己的服务器
构造消息实例
ImageMessage imageMessage = ImageMessage.obtain(thumbPathUri, localPathUri);
Message message = Message.obtain(targetId, conversationType, imageMessage);
调用下面的方法发送图片消息
* &p&发送图片消息,可以使用该方法将图片上传到自己的服务器发送,同时更新图片状态。&/p&
* &p&使用该方法在上传图片时,会回调 {@link io.rong.imlib.RongIMClient.SendImageMessageWithUploadListenerCallback}
* 此回调中会携带 {@link RongIMClient.UploadImageStatusListener} 对象,使用者只需要调用其中的
* {@link RongIMClient.UploadImageStatusListener#update(int)} 更新进度
* {@link RongIMClient.UploadImageStatusListener#success(Uri)} 更新成功状态,并告知上传成功后的图片地址
* {@link RongIMClient.UploadImageStatusListener#error()} 更新失败状态 &/p&
* @param message
发送消息的实体。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调,回调中携带 {@link RongIMClient.UploadImageStatusListener} 对象,用户调用该对象中的方法更新状态。
{@link #sendImageMessage(Message, String, String, RongIMClient.SendImageMessageCallback)}
RongIM.getInstance().sendImageMessage(message, pushContent, pushData, new RongIMClient.SendImageMessageWithUploadListenerCallback() {
public void onAttached(Message message, final RongIMClient.UploadImageStatusListener uploadImageStatusListener) {
/*上传图片到自己的服务器*/
uploadImg(imgMsg.getPicFilePath(), new UploadListener() {
public void onSuccess(String url) {
// 上传成功,回调 SDK 的 success 方法,传递回图片的远端地址
uploadImageStatusListener.success(Uri.parse(url));
public void onProgress(float progress) {
//刷新上传进度
uploadImageStatusListener.update((int) progress);
public void onFail() {
// 上传图片失败,回调 error 方法。
uploadImageStatusListener.error();
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
//发送失败
public void onSuccess(Message message) {
//发送成功
public void onProgress(Message message, int progress) {
//发送进度
图片缩略图机制:
缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。
大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。
语音消息发送
基本原理:录制语音,本地存储转换为 AMR 格式,获取语音时长,构造语音消息并发送。
* 获取语音消息实体。
* @param Uri
语音 Uri 。
* @param duration
语音时长(单位:秒)。
VoiceMessage vocMsg = VoiceMessage.obtain(Uri.fromFile(voiceFile), 10);
* &p&发送消息。
* 通过 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}
* 中的方法回调发送的消息状态及消息体。&/p&
* @param message
将要发送的消息体。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
RongIM.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
public void onAttached(Message message) {
//消息本地数据库存储成功的回调
public void onSuccess(Message message) {
//消息通过网络发送成功的回调
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
//消息发送失败的回调
注:语音消息默认的码率为 7950 bps, 您也可以通过更改资源文件 rc_configuration.xml 里 rc_audio_encoding_bit_rate 字段的值,
来自定义语音消息的码率。
图文消息发送
生成图文消息实例:
* 生成RichContentMessage对象。
* @param title
消息标题。
* @param content
消息内容。
* @param imageUrl 消息图片url.
* @return 生成RichContentMessage对象。
public static RichContentMessage obtain(String title, String content, String imageUrl)
RichContentMessage richContentMessage = RichContentMessage.obtain(&标题&, &内容&, &http://rongcloud.cn/images/logo.png&);
//&9517& 为目标 Id。根据不同的 conversationType,可能是用户 Id、讨论组 Id、群组 Id 或聊天室 Id。
//Conversation.ConversationType.PRIVATE 为会话类型。
Message myMessage = Message.obtain(&9517&, Conversation.ConversationType.PRIVATE, richContentMessage);
* &p&发送消息。
* 通过 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}
* 中的方法回调发送的消息状态及消息体。&/p&
* @param message
将要发送的消息体。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
RongIM.getInstance().sendMessage(myMessage, null, null, new IRongCallback.ISendMessageCallback() {
public void onAttached(Message message) {
//消息本地数据库存储成功的回调
public void onSuccess(Message message) {
//消息通过网络发送成功的回调
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
//消息发送失败的回调
文件消息发送
融云 SDK 默认支持文件发送功能,点击查看。
注: 融云 SDK 默认实现了文件管理器功能,如果您想自定义文件管理器,可以通过自定义会话扩展区的方式来自定义文件管理器,融云 SDK 中默认上传文件存储有效期为 6 个月,不支持文件迁移。
1. 自定义文件保存位置
接受到文件消息,并点击下载后,该文件默认保存在 SD 卡的 /RongCloud/Media/ 下。
您可以通过更改 SDK 的 res/values/rc_configuration.xml 里面的 rc_media_message_default_save_path 的值,来自定义文件的存储路径。
2. 文件消息相关功能说明
发送文件消息
* &p&发送多媒体消息&/p&
* &p&发送前构造 {@link Message} 消息实体&/p&
* @param message
发送消息的实体。
* @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
发送文件消息时,此字段必须填写,否则会收不到 push 推送。
* @param pushData
push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
* @param callback
发送消息的回调 {@link io.rong.imlib.RongIMClient.SendMediaMessageCallback}。
public void sendMediaMessage(Message message, String pushContent, final String pushData, final IRongCallback.ISendMediaMessageCallback callback)
下载文件消息
* 下载多媒体消息。
* 用来获取媒体原文件时调用。如果本地缓存中包含此文件,则从本地缓存中直接获取,否则将从服务器端下载。
* @param message
文件消息。
* @param callback
下载文件的回调。
public void downloadMediaMessage(Message message, final IRongCallback.IDownloadMediaMessageCallback callback)
取消文件下载
* 取消多媒体消息下载。
* @param message 包含多媒体文件的消息,
* @param callback 取消下载多媒体文件时的回调。
public void cancelDownloadMediaMessage(Message message, RongIMClient.OperationCallback callback)
如果您使用的是 IMLib SDK 集成,可参考 。
融云推送服务及集成第三方推送服务,详细请查看。
注意:部分 Android 手机系统在黑屏待机后自动清理后台运行的软件,这样影响了应用正常接收新的消息,需要将应用设置为后台运行应用。。
获取发出消息监听器
设置自己发出消息的监听器,在 init() 之后即可设置。
注意:如果在 Activity 里设置,需要在 Activity 销毁时,将监听设置为 null,防止内存泄露。
* 设置发送消息的监听。
* @param listener 发送消息的监听。
public void setSendMessageListener(OnSendMessageListener listener)
设置后实现消息发送监听接口 OnSendMessageListener ,消息发送失败可在 onSent 方法中根据 SentMessageErrorCode 返回的状态码实现自己的逻辑处理。onSent 返回 true 表示走自己的处理方式,否则走融云默认处理方式。
RongIM.getInstance().setSendMessageListener(new MySendMessageListener());
private class MySendMessageListener implements RongIM.OnSendMessageListener {
* 消息发送前监听器处理接口(是否发送成功可以从 SentStatus 属性获取)。
* @param message 发送的消息实例。
* @return 处理后的消息实例。
public Message onSend(Message message) {
//开发者根据自己需求自行处理逻辑
* 消息在 UI 展示后执行/自己的消息发出后执行,无论成功或失败。
* @param message
消息实例。
* @param sentMessageErrorCode 发送消息失败的状态码,消息发送成功 SentMessageErrorCode 为 null。
* @return true 表示走自己的处理方式,false 走融云默认处理方式。
public boolean onSent(Message message,RongIM.SentMessageErrorCode sentMessageErrorCode) {
if(message.getSentStatus()== Message.SentStatus.FAILED){
if(sentMessageErrorCode== RongIM.SentMessageErrorCode.NOT_IN_CHATROOM){
//不在聊天室
}else if(sentMessageErrorCode== RongIM.SentMessageErrorCode.NOT_IN_DISCUSSION){
//不在讨论组
}else if(sentMessageErrorCode== RongIM.SentMessageErrorCode.NOT_IN_GROUP){
//不在群组
}else if(sentMessageErrorCode== RongIM.SentMessageErrorCode.REJECTED_BY_BLACKLIST){
//你在他的黑名单中
MessageContent messageContent = message.getContent();
if (messageContent instanceof TextMessage) {//文本消息
TextMessage textMessage = (TextMessage) messageC
Log.d(TAG, &onSent-TextMessage:& + textMessage.getContent());
} else if (messageContent instanceof ImageMessage) {//图片消息
ImageMessage imageMessage = (ImageMessage) messageC
Log.d(TAG, &onSent-ImageMessage:& + imageMessage.getRemoteUri());
} else if (messageContent instanceof VoiceMessage) {//语音消息
VoiceMessage voiceMessage = (VoiceMessage) messageC
Log.d(TAG, &onSent-voiceMessage:& + voiceMessage.getUri().toString());
} else if (messageContent instanceof RichContentMessage) {//图文消息
RichContentMessage richContentMessage = (RichContentMessage) messageC
Log.d(TAG, &onSent-RichContentMessage:& + richContentMessage.getContent());
Log.d(TAG, &onSent-其他消息,自己来判断处理&);
接收消息监听
接收消息的监听器,在 init() 之后即可设置。注意,建议设置在 Application 里面,这样才能在整个应用的生命周期,都能监听到接收消息事件。
* 设置接收消息的监听器。
* 所有接收到的消息、通知、状态都经由此处设置的监听器处理。包括私聊消息、讨论组消息、群组消息、聊天室消息以及各种状态。
* @param listener 接收消息的监听器。
public static void setOnReceiveMessageListener(RongIMClient.OnReceiveMessageListener listener)
接收消息监听器的实现,所有接收到的消息、通知、状态都经由此处设置的监听器处理。包括私聊消息、讨论组消息、群组消息、聊天室消息以及各种状态。
RongIM.setOnReceiveMessageListener(new MyReceiveMessageListener());
private class MyReceiveMessageListener implements RongIMClient.OnReceiveMessageListener {
* 收到消息的处理。
* @param message 收到的消息实体。
* @param left
剩余未拉取消息数目。
* @return 收到消息是否处理完成,true 表示自己处理铃声和后台通知,false 走融云默认处理方式。
public boolean onReceived(Message message, int left) {
//开发者根据自己需求自行处理
Push 消息监听
您可以在自定义的继承融云 PushMessageReceiver 的广播接收器里面监听到 push 事件。
public class SealNotificationReceiver extends PushMessageReceiver {
/* push 通知到达事件*/
public boolean onNotificationMessageArrived(Context context, PushNotificationMessage message) {
// 返回 false, 会弹出融云 SDK 默认通知; 返回 true, 融云 SDK 不会弹通知, 通知需要由您自定义。
/* push 通知点击事件 */
public boolean onNotificationMessageClicked(Context context, PushNotificationMessage message) {
// 返回 false, 会走融云 SDK 默认处理逻辑, 即点击该通知会打开会话列表或会话界面; 返回 true, 则由您自定义处理逻辑。
关于融云推送的详细机制和功能,您可以参考。
连接状态监听
设置连接状态监听,必须在 init 后进行调用。 注意:建议设置在 Application 里面,这样才能在整个应用的生命周期,都能监听到状态变化。
* 设置连接状态变化的监听器。
* @param listener 连接状态变化的监听器。
public static void setConnectionStatusListener(final RongIMClient.ConnectionStatusListener listener)
实现连接状态监听器,以获取当前连接相关状态。
RongIM.setConnectionStatusListener(new MyConnectionStatusListener());
private class MyConnectionStatusListener implements RongIMClient.ConnectionStatusListener {
public void onChanged(ConnectionStatus connectionStatus) {
switch (connectionStatus){
case CONNECTED://连接成功。
case DISCONNECTED://断开连接。
case CONNECTING://连接中。
case NETWORK_UNAVAILABLE://网络不可用。
case KICKED_OFFLINE_BY_OTHER_CLIENT://用户账户在其他设备登录,本机会被踢掉线
会话列表操作监听
会话列表操作监听,在调用 init 之后即可进行设置。
* 设置会话列表界面操作的监听器。
RongIM.setConversationListBehaviorListener(new MyConversationListBehaviorListener());
实现会话列表操作监听接口 ConversationListBehaviorListener 。
private class MyConversationListBehaviorListener implements RongIM.ConversationListBehaviorListener{
* 当点击会话头像后执行。
* @param context
* @param conversationType 会话类型。
* @param targetId
被点击的用户id。
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true,否则返回 false,false 走融云默认处理方式。
boolean onConversationPortraitClick(Context context, Conversation.ConversationType conversationType, String targetId){
* 当长按会话头像后执行。
* @param context
* @param conversationType 会话类型。
* @param targetId
被点击的用户id。
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true,否则返回 false,false 走融云默认处理方式。
boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String targetId){
* 长按会话列表中的 item 时执行。
* @param context
* @param view
触发点击的 View。
* @param uiConversation 长按时的会话条目。
* @return 如果用户自己处理了长按会话后的逻辑处理,则返回 true, 否则返回 false,false 走融云默认处理方式。
public boolean onConversationLongClick(Context context, View view, UIConversation uiConversation) {
* 点击会话列表中的 item 时执行。
* @param context
* @param view
触发点击的 View。
* @param uiConversation 会话条目。
* @return 如果用户自己处理了点击会话后的逻辑处理,则返回 true, 否则返回 false,false 走融云默认处理方式。
public boolean onConversationClick(Context context, View view, UIConversation uiConversation) {
会话界面操作的监听器
会话界面操作的监听器,在调用 init 后即可进行设置
RongIM.getInstance().setConversationClickListener(new MyConversationClickListener());
实现会话界面操作的监听接口 ConversationClickListener 。会话界面中点击用户头像、长按用户头像、点击消息、长按消息、点击消息链接的操作都在此处理。
private class MyConversationClickListener implements RongIM.ConversationClickListener {
* 当点击用户头像后执行。
* @param context
* @param conversationType 会话类型。
* @param user
被点击的用户的信息。
* @param targetId
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true,否则返回 false,false 走融云默认处理方式。
public boolean onUserPortraitClick(Context context, Conversation.ConversationType conversationType, UserInfo user, String targetId) {
* 当长按用户头像后执行。
* @param context
* @param conversationType 会话类型。
* @param user
被点击的用户的信息。
* @param targetId
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true,否则返回 false,false 走融云默认处理方式。
public boolean onUserPortraitLongClick(Context context, Conversation.ConversationType conversationType, UserInfo user, String targetId) {
* 当点击消息时执行。
* @param context 上下文。
* @param view
触发点击的 View。
* @param message 被点击的消息的实体信息。
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true, 否则返回 false, false 走融云默认处理方式。
public boolean onMessageClick(Context context, View view, Message message) {
* 当点击链接消息时执行。
* @param context 上下文。
* @param link
被点击的链接。
* @param message 被点击的消息的实体信息
* @return 如果用户自己处理了点击后的逻辑处理,则返回 true, 否则返回 false, false 走融云默认处理方式。
public boolean onMessageLinkClick(Context context, String link, Message message) {
* 当长按消息时执行。
* @param context 上下文。
* @param view
触发点击的 View。
* @param message 被长按的消息的实体信息。
* @return 如果用户自己处理了长按后的逻辑处理,则返回 true,否则返回 false,false 走融云默认处理方式。
public boolean onMessageLongClick(Context context, View view, Message message) {
未读消息数监听器
未读消息数监听器,必须在 init 之后即可调用。
* 设置未读消息数变化监听器。
* 注意:如果是在 activity 中设置,那么要在 activity 销毁时,调用 {@link #removeUnReadMessageCountChangedObserver(IUnReadMessageObserver)}
* 否则会造成内存泄漏。
* @param observer
接收未读消息消息的监听器。
* @param conversationTypes 接收未读消息的会话类型。
public void addUnReadMessageCountChangedObserver(final IUnReadMessageObserver observer, Conversation.ConversationType... conversationTypes)
Activity 销毁时,移除监听。
* 注销已注册的未读消息数变化监听器。
* @param observer 接收未读消息消息的监听器。
public void removeUnReadMessageCountChangedObserver(final IUnReadMessageObserver observer)
会话列表自定义
会话列表相关布局文件
rc_fr_conversationlist.xml 会话列表布局文件
rc_item_conversation.xml 会话列表各个 item 对应的布局文件
可以通过修改这些布局文件修改背景或字体颜色等。
根据会话类型过滤显示的会话,以及配置是否聚合显示
可以根据会话类型,限制会话列表只显示某几个类型的会话,以及这些会话是否以聚合形式显示。
下面以自定义会话列表只显示单聊和群组会话为例,说明如何自定义:
a. 配置 Uri
b. 把自定义的 Uri 赋值给 ConversationListFragment
listFragment.setUri(uri);
头像位置自定义
对于会话列表中每种会话类型的会话,开发者都可以自定义头像位置的显示方式,显示方式有:靠左显示、靠右显示、不显示。
自定义步骤:
1、新建一类继承要改变的会话提供者类,然后重写注解,修改 portraitPosition 的值以完成显示方式。
注解说明:
注解名称:ConversationProviderTag。属性:conversationType ,portraitPosition 。
conversationType 的值不能重复不可修改,它是会话提供者的唯一标识;portraitPosition 用来控制头像的显示方式,它的值可以修改,它的值有:1:靠左显示, 2:靠右显示, 3:不显示。
模板说明:
提供者名称
注解 conversationType 值(不可修改)
注解 portraitPosition 初始值
(可修改)
二人会话提供者
PrivateConversationProvider.java
讨论组会话提供者
DiscussionConversationProvider.java
discussion
群聊会话提供者
GroupConversationProvider.java
客服会话提供者
CustomerServiceConversationProvider.java
customer_service
系统会话提供者
SystemConversationProvider.java
应用公众服务会话提供者
AppServiceConversationProvider.java
app_public_service
公众服务平台会话提供者
PublicServiceConversationProvider.java
public_service
2、重新注册该会话模板,注册方法应在 init 后调用
RongIM.getInstance().registerConversationT
自定义示例:
如何在会话列表中让所单聊会话头像都靠右显示?
@ConversationProviderTag(conversationType = &private&, portraitPosition = 2)
public class MyPrivateConversationProvider extends PrivateConversationProvider {
RongIM.getInstance().registerConversationTemplate(new MyPrivateConversationProvider());
会话页面自定义
会话页面相关布局文件
rc_fr_conversation.xml
会话页面布局
rc_item_message.xml
消息列表单个 item 对应的布局
您可以通过修改上述布局文件来更改字体大小颜色及背景色等。
消息展示自定义
融云 IMKit SDK 中每一种消息类型(要在 UI 展示的)都对应一个 UI 展示的 Provider,开发者可以修改 Provider 的注解属性来完成消息显示的自定义。
自定义步骤:
1、新建一类并继承要修改的消息提供者类,然后重写注解。
注解说明:
注解名称:ProviderTag。
注解属性:
messageContent
对应的消息类型 ( 如:TextMessage.class )。
showPortrait
设置是否显示头像,默认为 true。
centerInHorizontal
消息内容是否横向居中,默认 false。
是否隐藏消息, 默认 false。
showProgress
是否显示发送进度,默认 true。
showSummaryWithName
是否在会话的内容体里显示发送者名字,默认 true。
自定义示例:
如何在会话中让 TextMessage 不显示头像且消息内容横向居中显示?
自定义 TextMessage 的展示模板
@ProviderTag ( messageContent = TextMessage.class , showPortrait = false , centerInHorizontal = true )
public class MyTextMessageItemProvider extends TextMessageItemProvider
重新注册该消息模板,注册方法应在 init 后调用
RongIM.getInstance().registerMessageTemplate(new MyTextMessageItemProvider());
未读消息数目和新消息提醒
未读消息数目和新消息气泡在 IMKit 中默认不显示,如需要显示新消息提醒和未读消息数目可以在连接成功后通过下面方法设置。
RongIM.getInstance().enableNewComingMessageIcon(true);//显示新消息提醒
RongIM.getInstance().enableUnreadMessageIcon(true);//显示未读消息数目
新消息大于 1 条即展示,超过 99 条显示为 &99+&,未读消息大于 10 条即展示,超过 150 条显示为 &150+条新消息&。另外,控件的样式可以在 layout/rc_fr_messagelist.xml 中进行调整。
适配器 adapter 自定义
可以通过自定义会话列表或者会话界面的适配器,来自定义界面的展示。
下面以自定义会话界面消息列表的适配器为例,说明如何自定义:
3.1 自定义会话 fragment 继承自 ConversationFragment,复写 onResolveAdapter() 方法,返回自定义的 adapter。
另外您的 activity 布局文件中也需要配置成自定义的 fragment。
3.2 自定义继承 MessageListAdapter 的消息列表适配器,根据需要复写其中的 newView() 或者 bindView() 方法
输入区域自定义
输入区域相关概念:
1、输入区域扩展栏对外接口类为 RongExtension。如图 1
2、Plugin 是开发者自定义 “+” 号区域展开后的 item,如图 1
3、EmoticonTab 是开发者自定义 表情 tab 页。如图 2
一、布局自定义
部分布局文件如下,您可以通过修改对应的布局文件来调整界面布局,修改背景,更改字体等。
1、rc_ext_extension_bar.xml 输入框布局文件。它是整个输入框的容器,内部有对各部分组件功能描述。
2、rc_ext_input_edit_text.xml EditText 布局文件。如果想要替换背景,直接修改即可。
3、rc_ext_voice_input.xml 语音输入布局文件。
4、输入框模式自定义。
另外,在会界面中可以设置输入框的模式。针对聊天会话的语音/文本切换功能、内容输入功能、扩展功能,融云目前提供了 5 种排列组合模式:
语音/文本切换功能+内容输入功能+扩展功能
语音/文本切换功能+内容输入功能
扩展功能+内容输入功能
内容输入功能+扩展功能
内容输入功能
用户可以通过更改 rc_fr_conversation.xml 里 app:RCStyle=&SCE& ,更改默认输入显示形式。
二、“+”号扩展区域自定义
SDK 里默认定义了如下 Plugin,各 Plugin 的功能说明如下:
LocationPlugin
位置信息组件,需要用户自己集成第三方地图实现定位
RealTimeLocationPlugin
实时位置共享组件,内置了高德地图的界面,可直接使用
DefaultLocationPlugin
位置信息组件,已经内置了高德地图,实现了定位功能,可直接使用
CombineLocationPlugin
上面 DefaultLocationPlugin + RealTimeLocationPlugin 的综合组件
FilePlugin
ImagePlugin
自定义 Plugin
1、自定义 Plugin 并实现 IPluginModule。 如:
public class MyPlugin implements IPluginModule {
2、自定义一个 ExtensionModule 继承自 DefaultExtensionModule,复写其中的 getPluginModules() 方法,返回需要展示的 plugin 列表。如:
public class MyExtensionModule extends DefaultExtensionModule {
private MyPlugin myP
public List&IPluginModule& getPluginModules(Conversation.ConversationType conversationType) {
List&IPluginModule& pluginModules =
super.getPluginModules(conversationType);
pluginModules.add(myPlugin);
return pluginM
3、在初始化之后,取消 SDK 默认的 ExtensionModule,注册自定义的 ExtensionModule, 如下:
public void setMyExtensionModule() {
List&IExtensionModule& moduleList = RongExtensionManager.getInstance().getExtensionModules();
IExtensionModule defaultModule =
if (moduleList != null) {
for (IExtensionModule module : moduleList) {
if (module instanceof DefaultExtensionModule) {
defaultModule =
if (defaultModule != null) {
RongExtensionManager.getInstance().unregisterExtensionModule(defaultModule);
RongExtensionManager.getInstance().registerExtensionModule(new MyExtensionModule());
4、视频讲解如何在已默认支持照片、拍照、地理位置、音频通话等功能的情况下,新增自定义及减少默认功能项。
自定义 EmoticonTab
1、自定义 EmoticonTab 实现 IEmoticonTab。 如:
public class MyEmoticon implements IEmoticonTab {
2、自定义一个 ExtensionModule 继承自 DefaultExtensionModule,复写其中的 getEmoticonTabs() 方法,返回需要展示的 EmoticonTab 列表。如:
public class MyExtensionModule extends DefaultExtensionModule {
private MyEmoticon myE
public List&IEmoticonTab& getEmoticonTabs() {
List&IEmoticonTab& emoticonTabs =
super.getEmoticonTabs();
emoticonTabs.add(myEmoticon);
return emoticonT
3、在初始化之后,取消 SDK 默认的 ExtensionModule,注册自定义的 ExtensionModule, 如下:
public void setMyExtensionModule() {
List&IExtensionModule& moduleList = RongExtensionManager.getInstance().getExtensionModules();
IExtensionModule defaultModule =
if (moduleList != null) {
for (IExtensionModule module : moduleList) {
if (module instanceof DefaultExtensionModule) {
defaultModule =
if (defaultModule != null) {
RongExtensionManager.getInstance().unregisterExtensionModule(defaultModule);
RongExtensionManager.getInstance().registerExtensionModule(new MyExtensionModule());
三、输入区事件监听
自定义 fragment 继承 ConversationFragment, 即可获取或者复写 ConversationFragment 里的各个事件,如输入文本内容的变化,发送按钮或者语音按钮的点击事件等。
详细请参考。
消息自定义
1、继承 MessageContent
新建一自定义消息类,继承 MessageContent 如下面示例代码:
public class CustomizeMessage extends MessageContent {
private S//消息属性,可随意定义
2、重写和实现方法
实现 encode() 方法,该方法的功能是将消息属性封装成 json 串,再将 json 串转成 byte 数组,该方法会在发消息时调用,如下面示例代码:
public byte[] encode() {
JSONObject jsonObj = new JSONObject();
jsonObj.put(&content&, &这是一条消息内容&);
} catch (JSONException e) {
Log.e(&JSONException&, e.getMessage());
return jsonObj.toString().getBytes(&UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
覆盖父类的 MessageContent(byte[] data) 构造方法,该方法将对收到的消息进行解析,先由 byte 转成 json 字符串,再将 json 中内容取出赋值给消息属性。
public CustomizeMessage(byte[] data) {
String jsonStr =
jsonStr = new String(data, &UTF-8&);
} catch (UnsupportedEncodingException e1) {
JSONObject jsonObj = new JSONObject(jsonStr);
if (jsonObj.has(&content&))
content = jsonObj.optString(&content&);
} catch (JSONException e) {
RLog.e(this, &JSONException&, e.getMessage());
MessageContent 已实现 Parcelable 接口,下面需要实现 Parcelable 中的方法:
//给消息赋值。
public CustomizeMessage(Parcel in) {
content=ParcelUtils.readFromParcel(in);//该类为工具类,消息属性
//这里可继续增加你消息的属性
* 读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。
public static final Creator&CustomizeMessage& CREATOR = new Creator&CustomizeMessage&() {
public CustomizeMessage createFromParcel(Parcel source) {
return new CustomizeMessage(source);
public CustomizeMessage[] newArray(int size) {
return new CustomizeMessage[size];
* 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。
* @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。
public int describeContents() {
* 将类的数据写入外部提供的 Parcel 中。
* @param dest
对象被写入的 Parcel。
* @param flags 对象如何被写入的附加标志。
public void writeToParcel(Parcel dest, int flags) {
ParcelUtils.writeToParcel(dest, content);//该类为工具类,对消息中属性进行序列化
//这里可继续增加你消息的属性
3、增加注解信息
注解名:MessageTag ;属性:value ,flag; value 即 ObjectName 是消息的唯一标识不可以重复,开发者命名时不能以 RC 开头,避免和融云内置消息冲突;flag 是用来定义消息的可操作状态。
如下面代码段,自定义消息名称 CustomizeMessage ,vaule 是 app:custom ,flag 是 MessageTag.ISCOUNTED | MessageTag.ISPERSISTED 表示消息计数且存库。
@MessageTag(value = &app:custom&, flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)
public class CustomizeMessage extends MessageContent {
flag 值如下表:
MessageTag.NONE
为空值,不表示任何意义,发送的自定义消息不会在会话页面和会话列表中展示。
MessageTag.ISCOUNTED
表示客户端收到消息后,要进行未读消息计数(未读消息数增

我要回帖

更多关于 extends private 的文章

 

随机推荐