• 目录


1.下载开源项目​​LeanCloudChatKit-Android​

点击链接部分进行下载,或者直接clone命令下载(不知为何失败了,所以个人还是下载)

git clone git@github.com:leancloud/LeanCloudChatKit-Android.git

下载完之后发现又个模块叫leanCloudChatKit,把它作为module导入到自己的项目中。

2.简单配置

leanCloudChatKit-manifest配置

如果直接导入模块,使用其中的Activity类时可能会出问题,我这里有报错,各种不兼容AppCompat,如果你那里也存在这个问题,就需进行如下操作:
在manifest中为所有的leanCloudChatKit在Activity级别添加:

android:theme="@style/LCIMKitTheme"

权限这个项目没有适配,需要自己适配,这里测试就没做适配了。

工程的build.gradle

buildscript {
repositories {
jcenter()
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/releases"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

allprojects {
repositories {
jcenter()
//这里是 LeanCloud 的包仓库
maven {
url "http://mvn.leancloud.cn/nexus/content/repositories/releases"

这样就基本配置就完成了。

application配置

SDKInitializer.initialize(getApplicationContext());

// 初始化参数依次为 this, AppId, AppKey

.getInstance().setProfileProvider(CustomUserProvider.getInstance());
AVOSCloud.setDebugLogEnabled(true);
LCChatKit.getInstance().init(getApplicationContext(), APP_ID, APP_KEY);
AVIMClient.setAutoOpen(false);
PushService.setDefaultPushCallback(this, MainActivity2.class);

此处的app_id和app_key需要在leancloud官网控制台进行申请:​​leancloud官网​​​
比较坑的是不能复制,需要抄写,这里要小心,不要抄错了。

代码接入即时聊天

LCChatKit.getInstance().open(editNo.getText().toString(), new AVIMClientCallback() {
@Override
public void done(AVIMClient avimClient, AVIMException e) {
if (null == e) {
Intent intent = new Intent(LoginActivity.this,MainActivity2.class);
startActivity(intent);
} else {
Toast.makeText(LoginActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
});

此段代码用于聊天功能登录,这里的id可以随意设置,但是注意,不同用户之间id不同。

然后这里要进行聊天了。聊天主要通过会话对象实现同一频道相互发送消息,这里有两种形式,一种是或去信息列表,参与聊天(多人用),一种是单人的,这里就介绍单人聊天。

创建会话

List<String> chatIds =  Arrays.asList("Tom");
LCChatKit.getInstance().getClient().createConversation(
chatIds,"", null, false, true, new AVIMConversationCreatedCallback() {
@Override
public void done(AVIMConversation avimConversation, AVIMException e) {
if (null != e) {
Toast.makeText(MainActivity2.this, e.getMessage(), Toast.LENGTH_SHORT).show();
} else {
MainActivity2.this.conversation = avimConversation;

LCIMNotificationUtils.addTag(conversation.getConversationId());
initReceiveMsg();

LCIMConversationItemCache.getInstance().insertConversation(conversation.getConversationId());
}
}
});

这里需要注意:asList中需要的是userid,就是各个用户登录后的userid,这个userid是不需要包括自己的。只有创建会话以后,才能接受消息。

获取首次消息

private void initReceiveMsg() {

conversation.queryMessages(new AVIMMessagesQueryCallback() {
@Override
public void done(List<AVIMMessage> messageList, AVIMException e) {
if (null == e && messageList.size()>0) {
message = messageList.get(messageList.size()-1);
LCIMProfileCache.getInstance().getCachedUser(message.getFrom(), new AVCallback<LCChatKitUser>() {
@Override
protected void internalDone0(LCChatKitUser userProfile, AVException e) {
txtReceiveMsg.setText(userProfile.getUserName()+":"+message.getContent());

}}
);
}
}
});

}

接收实时消息

  • EventBus进行注册反注册

使用EventBus,需要在onCreate的时候进行register,onDestroy的时候进行unregister:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
  • 然后在订阅者中进行接收处理

简单的说就是AVIMTypedMessageHandler负责接收推送过来的消息,然后通过总线模式回传给界面。

@Subscribe
public void onEvent(LCIMIMTypeMessageEvent event){
if(event.conversation.getConversationId() != conversation.getConversationId())
return;
message = event.message;
LCIMProfileCache.getInstance().getCachedUser(message.getFrom(), new AVCallback<LCChatKitUser>() {
@Override
protected void internalDone0(LCChatKitUser userProfile, AVException e) {
txtReceiveMsg.setText(userProfile.getUserName()+":"+message.getContent());

}}
);
}