最近项目中需要集成即时通讯,于是就选择了融云,按照步骤一步一步来还是很简单的,我做的只是单聊,(可支持发送文字、表情、图片、语音)下面记录一下
先上图
步骤:
一,去融云官网注册账号然后创建应用,应用创建完成后把自己的App Key记录下来 我们在配置的时候会用到**
二,第二步下载SDK ,我是直接下载的IMKit,上边有介绍,能实现基本的功能,可根据自己的需求下载
下载完是这样的
三,将IMKit和IMLib导入自己的项目中
这样就导进来了
最好也在App的build.gradle中看一下有没有引入
四,好了准备工作一切完毕,下面划重点,初始化融云。在整个应用程序中,只需要调用一次 init 方法。
public class App extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
RongIM.init(this);
}
五,打开 IMLib Module 的 AndroidManifest.xml 文件,把RONG_CLOUD_APP_KEY的值修改为自己的 AppKey. 如图:
在应用的 App Module 的 AndroidManifest.xml 文件中,添加 FileProvider 相关配置,修改 android:authorities 为App 的应用的 “ApplicationId”.FileProvider。
六,连接融云,我是放在程序登录成功后执行的
RongIM.connect(token, new RongIMClient.ConnectCallback() {
/*
* Token 错误。可以从下面两点检查
* 1. Token 是否过期,如果过期您需要向 App Server 重新请求一个新的 Token
* 2. token 对应的 appKey 和工程里设置的 appKey 是否一致
*/
@Override
public void onTokenIncorrect() {
}
/*
* 连接融云成功
* @param userid 当前 token 对应的用户 id
*
*/
@Override
public void onSuccess(String userid) {
Log.d("LoginActivity", "融云连接成功!!!" + userid);
}
/*连接融云失败
* @param errorCode 错误码,可到官网 查看错误码对应的注释
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
Log.d("LoginActivity", "融云连接失败!!!" + errorCode);
}
});
七,下面开始配置会话列表先来配置布局文件 注:name是固定不能修改的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/conversationlist"
android:name="io.rong.imkit.fragment.ConversationListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="12dp"/>
</LinearLayout>
在代码中
ConversationListFragment listFragment = (ConversationListFragment) ConversationListFragment.instantiate(mContext, ConversationListFragment.class.getName());
Uri uri = Uri.parse("rong://" + getActivity().getApplicationInfo().packageName).buildUpon()
.appendPath("conversationlist")
.appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false")
.appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")
.appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "false")
.appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")
.appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "false")
.build();
listFragment.setUri(uri);
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
//将融云的Fragment界面加入到我们的页面。
transaction.add(R.id.conversationlist, listFragment);
transaction.commitAllowingStateLoss();
在AndroidManifest中,融云 SDK 是通过隐式调用的方式来实现界面跳转的,您的会话列表 Activity 下面配置 intent-filter,其中,android:host 是您应用的 ApplicationId,需要手动修改,其他请保持不变。
<!-- 会话列表 -->
<activity
android:name=".activity.New_MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="替换成您的ApplicationId"
android:pathPrefix="/conversationlist"
android:scheme="rong" />
</intent-filter>
</activity>
八,接下来是新建会话页面Activity
布局文件中
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@drawable/bg_doctor_blue"
android:elevation="3dp"
>
<ImageView
android:id="@+id/back"
android:layout_width="40dp"
android:layout_height="match_parent"
android:padding="10dp"
android:src="@mipmap/back_white"/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="与 对话中"
android:textSize="16sp"
android:textColor="@color/bg_white"
android:gravity="center"
android:layout_centerInParent="true"/>
</RelativeLayout>
<fragment
android:id="@+id/conversation"
android:background="@color/bg_white"
android:name="io.rong.imkit.fragment.ConversationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
会话 Activity
//设置自己的信息
RongIM.getInstance().setCurrentUserInfo(new UserInfo(UserUtils.getUid(), UserUtils.getName(), Uri.parse(UserUtils.getHeader())));
//与我聊天的人的名字
String sName = getIntent().getData().getQueryParameter("title");//获取暱称
//与我聊天的人的Uid
String targetId = getIntent().getData().getQueryParameter("targetId");//获取对方id
title.setText("与" + sName + " 对话中");
配置 intent-filter 在 AndroidManifest.xml 中,会话 Activity 下面配置 intent-filter。 注意请修改 android:host 为您应用的 ApplicationId,其他保持不变。**
<activity
android:name=".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" />
<data
android:host="替换成您的ApplicationId"
android:pathPrefix="/conversation/"
android:scheme="rong" />
</intent-filter>
</activity>
写到这 基本的单聊功能就可以会实现了
九,如何从别的页面点击跳转至会话页面呢
//跳转到聊天页面 传入对方的id 和 名字
RongIM.getInstance().startPrivateChat(context, TargetUserId, Title);
十,记录一下按照我们需求要改的地方
1,如何缓存用户的信息,则通过refreshUserInfoCache(注:如果有好友更换了头像,需通过refreshUserInfoCache来存储)
RongIM.getInstance().refreshUserInfoCache(new UserInfo(list.get(Position).getUid() + "", list.get(Position).getName(), Uri.parse(list.get(Position).getAvatar())));
2,融云默认头像是方的,如果要改成圆形则需要在IMKit中找到下边这三个文件
rc_item_conversation.xml 会话列表
rc_item_message.xml 会话页面
rc_item_conversation_member.xml 设置页面
根据需求替换相应的属性, 每个文件有两处需替换
//圆形
app:RCShape="circle"
android:scaleType="centerCrop"
//方形
app:RCShape="square"
android:scaleType="centerCrop"
3, 如果需要修改聊天气泡的背景,换成自己的.9图, 则在IMKit文件夹中替换这些drawable文件
rc_ic_bubble_right.9.png rc_ic_bubble_left.9.png
rc_ic_bubble_no_right.9.png rc_ic_bubble_no_left.9.png
rc_ic_bubble_right_file.9.png rc_ic_bubble_left_file.9.png
3,如果需要修改会话列表的样式则在R.layout.rc_item_conversation文件中按需求自定义就可以