即时通讯是目前最为流行的通讯方式,大多数app都使用到即时通讯,Android开发中,比较火的即时通讯有:融云、环信、Jpush。融云可以实现IM、推送、直播、客服等功能,下面就来讲解一下融云即时通讯的使用以及聊天功能的集成。
简单介绍下融云:
官网:http://www.rongcloud.cn/
融云是国内首家专业的即时通讯云服务提供商,专注为互联网、移动互联网开发者提供免费的即时通讯基础能力和云端服务。通过融云平台,开发者不必搭建服务端硬件环境,就可以将即时通讯、实时网络能力快速集成至应用中。融云 SDK 包括两部分:IM 界面组件(IMKit)和 IM 通讯能力库( IMLib)。使用步骤:
一、前期准备:
1.可以先看安卓SDK集成说明文档:http://www.rongcloud.cn/docs/android.html
2.下载融云IMSDK(记得注册帐号):http://www.rongcloud.cn/download
两个SDK的区别:
3.集成融云SDK的环境要求:
查看自己编译工具的构建版本:
查看自己编译工具使用的构建版本:
4.创建一个集成融云SDK的应用:
得到自己融云应用的key
手动的创建Token(相当于创建一个用户,这里创建两个用户),方便我们的测试:
二、集成融云sdk并实现聊天
1.解压下载好的sdk,并进行使用
2.导入 SDK 压缩包中的 IMKit 作为依赖 Module
3.做好项目依赖以后,对清单文件的修改,到ModuleIMkit中打开清单文件修改RONG_CLOUD_APP_KEY,修改为你自己的key,并将AndroidManifest中所有host改为你依赖项目的包名(此处指你集成融云SDK app的包名)。
4.在Application中初始化(记得在清单文件注册)
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//项目一运行,就初始化融云SDK
RongIM.init(this);
}
}
5.在 activity 中建立与融云服务器的连接,RongIM.connect(token,callback)最核心的一段逻辑(在整个应用程序全局application中,只需要调用一次 connect 方法,SDK 会负责自动重连,即使当前网络链接不存在而失败,融云仍然会自动替您重连)以在MainActivity()中做融云的连接操作为例(注意:此处的Token需要换成你自己的 Token,这个Token还需要与RONG_CLOUD_APP_KEY 匹配)。
注意,在上线前请确认在connect方法ConnectCallback中通过onTokenIncorrect回调方法实现重新获取Token的逻辑
下面的代码放到MainActivity的Oncreate方法里即可。
String Token = "pCus5wbhCrVtQySGahLk2zkawGWVjeK0G5MCxDFa2kaAlY31thuyQVjM6vEvUsF2ws02NIyQdNuhqb6GEyYyXA==";//test
/**
* IMKit SDK调用第二步
*
* 建立与服务器的连接
*
*/
RongIM.connect(Token, new RongIMClient.ConnectCallback() {
@Override
public void onTokenIncorrect() {
//Connect Token 失效的状态处理,需要重新获取 Token
}
@Override
//连接成功
public void onSuccess(String userId) {
Log.e("MainActivity", "——onSuccess—-" + userId);
}
@Override
//连接失败 errorCode错误码
public void onError(RongIMClient.ErrorCode errorCode) {
Log.e("MainActivity", "——onError—-" + errorCode);
}
});
6.完成单聊的UI界面,单聊是一个fragment,需创建一个activity中,在布局文件中添加单聊的fragment,并且在 AndroidManifest中添加intent-filter,进行配置。
1)先创建ConversationActivity
public class ConversationActivity extends ActionBarActivity {
private static final String TAG = ConversationActivity.class.getSimpleName();
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//唯一有用的代码,加载一个 layout
setContentView(R.layout.conversation);
//继承的是ActionBarActivity,直接调用 自带的 Actionbar,下面是Actionbar 的配置,如果不用可忽略…
getSupportActionBar().setTitle("聊天");
getSupportActionBar().setLogo(R.mipmap.ic_launcher);//把它改成我们有的图片
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//是否在左上角显示图标
getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_launcher);//把它改成我们有的图片
}
/* Override
菜单我们用不到,注释掉.
public boolean onOptionsItemSelected(MenuItem item) {
finish();
return super.onOptionsItemSelected(item);
}*/
}
2)创建ConversationActivity的布局文件conversation.xml
3)在AndroidManifest注册,注意需修改 host 为自己的包名,其他不需要修改
7.调用开启单聊的逻辑代码,在activity中调用
RongIM.getInstance().startPrivateChat(context,targetUserId,title);
//通过点击按钮,执行聊天的逻辑代码,按钮自定义.核心是里面的方法.
public void OpenTalk(View view){
/**
* 启动单聊,先判断RongIM对象不为null
* context - 应用上下文。
* targetUserId - 要与之聊天的用户 Id,也就是上面注册的token(用户)
* title - 聊天的标题,如果传入空值,则默认显示与之聊天的用户名称。
*/
if (RongIM.getInstance() != null) {
RongIM.getInstance().startPrivateChat(MainActivity.this,"110","易大师好帅!");
}
}
在已经集成了融云IMKitsdk,并完成了单人聊天的前提下,再完成显示用户昵称和头像的功能
1.修改ConversationActivity类让它继承 FragmentActivity显示用户的昵称
public class ConversationActivity extends FragmentActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.conversation);
mTextView = (TextView) findViewById(R.id.title);
mTextView.setText(getIntent().getData().getQueryParameter("title"));
Log.e("type", "type is:" + getIntent().getData().getPath());
}
}
2.修改ConversationActivity的布局文件,在加上一个TextView(以下提供完成的布局文件代码)
3.创建一个bean数据,类名自定义,这里就起名为Friend,添加三个属性userId,userName,portraitUri创建对应的get,set和构造方法
public class Friend {
private String userId;
private String userName;
private String portraitUri;
public Friend(String userId, String userName, String portraitUri) {
this.userId = userId;
this.userName = userName;
this.portraitUri = portraitUri;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPortraitUri() {
return portraitUri;
}
public void setPortraitUri(String portraitUri) {
this.portraitUri = portraitUri;
}
}
4.在MainActivity的类(也就是要调用聊天功能的Activity)中实现显示用户昵称和头像的核心代码
1)Activity实现接口RongIM.UserInfoProvider,覆写其必要的方法
MainActivity implements RongIM.UserInfoProvider
2)定义全局私有变量private List
userIdList = new ArrayList();
userIdList.add(new Friend("123", "张三","https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"));
userIdList.add(new Friend("456", "李四","https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"));
3)调用加载用户昵称和头像的核心方法:
RongIM.setUserInfoProvider(this, true);
参数:1.userInfoProvider - 用户信息提供者 RongIM.UserInfoProvider。
参数2.isCacheUserInfo - 设置是否由 IMKit 来缓存用户信息,最好将本参数设置为 true,由 IMKit 来缓存用户信息。
设置用户信息的提供者,供 RongIM 调用获取用户名称和头像信息。 设置后,当 sdk 界面展示用户信息时,会回调 RongIM.UserInfoProvider.getUserInfo(String) 使用者只需要根据对应的 userId 提供对应的用户信息。 如果需要异步从服务器获取用户信息,使用者可以在此方法中发起异步请求,然后返回 null 信息。 在异步请求结果返回后,根据返回的结果调用 refreshUserInfoCache(UserInfo) 刷新用户信息。
4)在会自动回调的getUserInfo完成上传用户数据给融云的逻辑代码
public UserInfo getUserInfo(String s) {
//使用for循环从集合中取出数据,提供给融云自动加载用户昵称及头像
for (Friend i : userIdList) {
if (i.getUserId().equals(s)) {
Log.e("LoginActivity", i.getPortraitUri());
return new UserInfo(i.getUserId(),i.getUserName(), Uri.parse(i.getPortraitUri()));
}
}
Log.e("MainActivity","UserId is :" +s );
return null;
}
5.刷新用户信息头像(可以在点击事件里执行该逻辑,效果看起来更加明显)
//获取 IMKit RongIM 实例对象,需在执行 init 方法初始化 SDK 后获取,否则会返回值NULL。
RongIM instance = RongIM.getInstance();
instance.refreshUserInfoCache(new UserInfo("123", "张三",Uri.parse
("http://img5.imgtn.bdimg.com/it/u=1518359788,384768247&fm=21&gp=0.jpg")));
效果图(图示之前截的,昵称可能不对):