目录 下载开源项目LeanCloudChatKit-Android 简单配置 leanCloudChatKit-manifest配置 工程的buildgradle application配置 代码接入即时聊天 创建
- 目录
- 下载开源项目LeanCloudChatKit-Android
- 简单配置
- leanCloudChatKit-manifest配置
- 工程的buildgradle
- application配置
- 代码接入即时聊天
- 创建会话
- 获取首次消息
- 接收实时消息
1.下载开源项目LeanCloudChatKit-Android
点击链接部分进行下载,或者直接clone命令下载(不知为何失败了,所以个人还是下载)
git clone git@github.com:leancloud/LeanCloudChatKit-Android.git下载完之后发现又个模块叫leanCloudChatKit,把它作为module导入到自己的项目中。
2.简单配置
leanCloudChatKit-manifest配置
如果直接导入模块,使用其中的Activity类时可能会出问题,我这里有报错,各种不兼容AppCompat,如果你那里也存在这个问题,就需进行如下操作:
在manifest中为所有的leanCloudChatKit在Activity级别添加:
权限这个项目没有适配,需要自己适配,这里测试就没做适配了。
工程的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:
@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
- 然后在订阅者中进行接收处理
简单的说就是AVIMTypedMessageHandler负责接收推送过来的消息,然后通过总线模式回传给界面。
@Subscribepublic 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());
}}
);
}