Android开发接入融云案例

释放双眼,带上耳机,听听看~!

第一步:去融云开发者后台注册开发者账号,新建一个应用,获取到App Key 和App Secret 

 第二步:导入sdk

2.1 到https://www.rongcloud.cn/downloads/下载sdk,并熟悉各个组件,这里用到IMKit和IMLib

2.2  打开android studio ,点击File -> New -> Import Module

     2.3选择我们需要的module,点击finish(IMKit和IMLib一样导入)

       2.4找到项目的settings.gradle,在settings.gradle里添加include ‘:IMKit’,’:IMLib’

          2.5 将添加的module作为app的lib使用,点击file->Project Structure

         2.6点击App(IMKit和IMLib作为App的lib)点击Dependencies,在点击+号,选择需要的module

最后发现在build.gradle文件里多了(可以省略2.4-2.6,直接添加下面的代码,因为2.4-2.6的结果就是下面的两句代码)

implementation project(':IMKit')
implementation project(':IMLib')

          2.7打开IMLib 的 AndroidManifest.xml 文件,把 meta-data RONG_CLOUD_APP_KEY 的值修改为自己的 AppKey.

      2.8  在应用的 App Module 的 AndroidManifest.xml 文件中,添加 FileProvider 相关配置,修改 android:authorities 为App 的应用的 “ApplicationId”.FileProvider

 第三步:初始化 在application的onCreate()方法里添加RongIM.init(this);

 第四步:获取用户Token,点击API调用,用户服务,获取Token,输入userId,name,portraitUri,点击提交

第五步:连接服务

1 connect 方法在应用的生命周期里只需要调用一次,且必须在主进程调用。
2 连接失败,SDK 会自动启动重连机制,无需进行重连操作。 应用的生命周期:应用场长时间后台之后,应用被回收,此时属于新的进程,也需要调用 connect 方法。 自动重连机制:进行最多 10 次重连,分别是 1、2、4、8、16、32、64、128、256、512 秒后。若没有连接成功,还会在检测网络状态变化时再次重连。

第六步:配置会话界面(静态方式)

  61.配置布局文件: 会话界面 对应的布局文件 conversation.xml。

<?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">
<!--没有继承io.rong.imkit.fragment.ConversationFragment就填io.rong.imkit.fragment.ConversationFragment,继承了ConversationFragment前面就填自己的包名)-->
<fragment
android:id="@+id/conversation"
android:name="com.example.administrator.fragment.ConversationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

   6.2在ConversationActivity 的onCreate 中添加配置代码(mConversationType 是指您的会话类型,mtargetId 是指的您的 targetId )

//显示标题
conversation_username.setText(getIntent().getData().getQueryParameter("title"));
//配置代码
FragmentManager fragmentManage = getSupportFragmentManager();
ConversationFragment fragement = (ConversationFragment) fragmentManage.findFragmentById(R.id.conversation);
Uri uri = Uri.parse("rong://" + getApplicationInfo().packageName).buildUpon()
.appendPath("conversation").appendPath(mConversationType.getName().toLowerCase())
.appendQueryParameter("targetId", getIntent().getData().getQueryParameter("targetId")).build();
fragement.setUri(uri);

 6.3启动会话界面(我们要至少准备两个账号(第四步),targetUserId传入userId,title传入通过用userId调查询用户信息接口获取到的userName(API调用,查询用户信息))

RongIM.getInstance().startPrivateChat(MainActivity.this, Constant.userId, Constant.title);//这是单聊
显示的结果,我们获取的token的时候传入了头像地址,这里没有显示

那我们就刷新用户信息,先调用查询用户信息接口获取到数据(地址https://docs.rongcloud.cn/im/server/user/#user_info)

注:不建议客户端查询,因为要传入app-key,最好从服务器端获取数据,我是写小案例,就这样写了

@FormUrlEncoded
@POST("/user/info.json")
Call<Object> getUsrInfo(@HeaderMap Map<String, String> headers, @Field("userId") String userId);

//刷新用户列表
RongIM.getInstance().refreshUserInfoCache(new UserInfo(map.get("userName"), map.get("userName"), Uri.parse(map.get("userPortrait"))));

查看结果(这是sunshine_0808找sunshine_0707聊天,刷新sunshine_0808和sunshine_0707的数据)

6.4相互聊天

已经运行了sunshine_0808,现在运行sunshine_0707,(Constant.userId, Constant.title填sunshine_0808相关的)

RongIM.getInstance().startPrivateChat(MainActivity.this, Constant.userId, Constant.title);
//getUsrInfot刷新sunshine_0707和sunshine_0808的数据
apiService.getUsrInfo(headMap, "sunshine_0707");
apiService.getUsrInfo(headMap, "sunshine_0808");

6.5 撤回消息

在 rc_config.xml 中将 rc_enable_message_recall 置为 true 可开启消息撤回功能。
rc_message_recall_interval 用来设置撤回消息的有效时间,以秒为单位。消息发送成功后,在有效时间内能撤回,超过有效时间不再执行撤回操作。

<!-- 设置是否支持消息撤回-->
<bool name="rc_enable_message_recall">true</bool>
<!-- 消息撤回有效时间(单位:秒)-->
<integer name="rc_message_recall_interval">120</integer>

结果:

6.6查看正在输入

rc_configuration.xml 里的 rc_typing_status 开关可以开启输入状态提醒的功能。(目前仅支持单聊。默认为 true 开启,设置为 false 为关闭)

<!-- 设置发送输入状态 -->
<bool name="rc_typing_status">true</bool>

在集成了 ConversationFragment 的 activity 里注册输入状态的监听,在 activity 的 onCreate() 里添加代码。

RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {
@Override
public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection<TypingStatus> typingStatusSet) {
//当输入状态的会话类型和targetID与当前会话一致时,才需要显示
if (type.equals(mConversationType) && targetId.equals("sunshine_0808")) {
//count表示当前会话中正在输入的用户数量,目前只支持单聊,所以判断大于0就可以给予显示了
int count = typingStatusSet.size();
if (count > 0) {
Iterator iterator = typingStatusSet.iterator();
TypingStatus status = (TypingStatus) iterator.next();
String objectName = status.getTypingContentType();
MessageTag textTag = TextMessage.class.getAnnotation(MessageTag.class);
MessageTag voiceTag = VoiceMessage.class.getAnnotation(MessageTag.class);
//匹配对方正在输入的是文本消息还是语音消息
if (objectName.equals(textTag.value())) {
//显示“对方正在输入”
Toast.makeText(getApplicationContext(),"对方正在输入",Toast.LENGTH_LONG).show();
} else if (objectName.equals(voiceTag.value())) {
//显示"对方正在讲话"
Toast.makeText(getApplicationContext(),"对方正在讲话",Toast.LENGTH_LONG).show();
}
} else {
//当前会话没有用户正在输入,标题栏仍显示原来标题
Toast.makeText(getApplicationContext(),"当前会话没有用户正在输入",Toast.LENGTH_LONG).show();
}
}
}
});

结果:

6.7 查看消息回执

设置 rc_config.xml 里的 rc_read_receipt ,可开启消息的阅读回执功能。默认为 false 关闭状态,设置成 true 为开启。

<!-- 设置已读回执,目前仅支持单聊、群聊、讨论组 -->
<bool name="rc_read_receipt">true</bool>

需在 init 之后调用 setReadReceiptConversationTypeList 方法来设置支持消息回执的会话类型。(目前只支持 PRIVATE、GROUP 和 DISCUSSION 。默认只有 PRIVATE 类型的会话支持消息回执。)

Conversation.ConversationType[] types = new Conversation.ConversationType[]{
Conversation.ConversationType.PRIVATE,
Conversation.ConversationType.GROUP,
Conversation.ConversationType.DISCUSSION
};
RongIM.getInstance().setReadReceiptConversationTypeList(types);

注:我看到的消息回执就是会话旁边的蓝色的小对勾

6.8 查看草稿(实现功能,写个小案例,正式项目别这样写)

//保存草稿
RongIM.getInstance().saveTextMessageDraft(Conversation.ConversationType.PRIVATE, "sunshine_0808", "我看了黄历说今日宜相逢,宜重逢", new RongIMClient.ResultCallback<Boolean>() {
@Override
public void onSuccess(Boolean aBoolean) {
//获取草稿
RongIM.getInstance().getTextMessageDraft(Conversation.ConversationType.PRIVATE, "sunshine_0808", new RongIMClient.ResultCallback<String>() {
@Override
public void onSuccess(String success) {
Log.d(TAG, "success =" + success);
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.d(TAG, "errorCode =" + errorCode);
}
});
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.d(TAG, "errorCode =" + errorCode);
}
});

结果:

6.9 快捷回复

1、创建一个 List<String> 将需要快捷回复的消息内容放进去

2、在初始化 SDK 后立刻调用以下方法,将创建的回复消息 List 作为参数传入。(设置每条回复消息内容不超过 30 个字)

//快捷回复
List<String> listMessage = new ArrayList<String>();
listMessage.add("嗨");
listMessage.add("hello");
listMessage.add("你好啊");
RongExtensionManager.getInstance().addPhraseList(listMessage);

3.点击常用语(点击列表里的某一项,自动发送)

6.10 会话列表界面

Map<String,Boolean> supportedConversation = new HashMap<>();
supportedConversation.put(Conversation.ConversationType.GROUP.getName(), false);
//启动会话列表界面
RongIM.getInstance().startConversationList(MainActivity.this, supportedConversation);

结果:(我是sunshine_0707,我和sunshine_0808讲段子)

6.11显示新消息提醒

RongIM.getInstance().enableNewComingMessageIcon(true);
RongIM.getInstance().enableUnreadMessageIcon(true);

结果:


7.群聊

7.1创建群聊(可以调接口,我前面也调用了一个获取用户的接口)

7.2加入群成员

7.3启动群聊

RongIM.getInstance().startGroupChat(MainActivity.this, Constant.groupId, Constant.groupTitle);
public static final String groupId = "DuanZiGroup";
public static final String groupTitle = "段子交流群";

人已赞赏
Android文章

Android开发友盟多渠道打包和统计

2021-2-1 19:37:23

Android文章

Android开发集成openinstall

2021-2-1 20:30:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索