我的上一篇博客简要的介绍了一下我对即时通讯的一些尝试,后面还介绍了通过bmob实现即时通讯的方式,上一篇主要是对我的一些经验的分享,所以我只提取了很简要的部分讲解,考虑到一些读者可能难以理解,所以为帮助读者理解,这篇博客将手把手教学。
总的步骤如下:
- 注册并创建应用
- 获取应用的application id
- 导入即时通讯sdk
- 初始化sdk
- 连接服务器
- 发送消息
- 接收消息
先给大家看看效果:
注册并创建应用
首先你去bmob平台注册一个开发者账号,流程很简单,不需要很严格的审查。
注册完成后,自行创建一个应用,填写的信息很简单,没有特殊要求。
获取应用的application id
点击进入应用 ->点击设置 ->查看application id 相信如图所示,复制一下这个application id 备用
导入即时通讯sdk
对于eclipse用户来说比较麻烦,需要自行下载demo中lib包,并导入并编译。而Android Studio用户只需做两步
Step 1:
在项目中的build.gradle中的repositories{}中添加 jcenter()和
maven { url “https://raw.github.com/bmob/bmob-android-sdk/master” }
Step 2:
在app中的build.gradle 中添加
compile ‘cn.bmob.android:bmob-im:2.0.6@aar’
compile ‘cn.bmob.android:bmob-sdk:3.5.5’
因为两者有集成包冲突还需要加上一个
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/rxjava.properties'
}
结果如下图所示:
初始化sdk
集成好sdk后需要配置一些东西:
首先在你项目中的manifest中注册一些receiver和service
<receiver android:name="cn.bmob.newim.core.ConnectChangeReceiver">
<intent-filter>
<action android:name="cn.bmob.action.RECONNECT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<service
android:name="cn.bmob.newim.core.service.BmobIMService"
android:process=":bmobcore" />
<service
android:name="cn.bmob.newim.core.service.NotifyService"
android:process=":bmobcore" />
<service android:name="cn.bmob.newim.core.service.ReConnectService" />
<service android:name="cn.bmob.newim.core.service.HeartBeatService" />
并配置你的密匙:
这里的application id就是前面我们获取到的
<meta-data
android:name="Bmob_APP_KEY"
android:value="你自己的application id" />
并配置上一些基础的权限,包括网络权限、WiFi等权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
弄好了这些还需要在application中进行初始化,首先你要新建一个类集成application,
如图所示:
这里面那个BmobIM.registerDefaultMessageHandler(new ImMessageHandler());是注册消息接收类,不理解没关系,等下会讲。别忘记给把application在manifest中声明。
连接服务器
一些都准备就绪,现在开始连接服务器
BmobIM.connect(et_connect_id.getText().toString(), new ConnectListener() {
@Override
public void done(String s, BmobException e) {
if (e == null){
isConnect = true;
Log.i("TAG","服务器连接成功");
}else {
Log.i("TAG",e.getMessage()+" "+e.getErrorCode());
}
}
});
通过以上代码就可以连接服务器。et_connect_id.getText().toString()传入的是你连接服务器的标识id,作为其他用户与你通信的标识。在你需要连接服务器的时候即可调用此代码
发送消息
连接完服务器后就可以进行消息的发送了。
BmobIMUserInfo info =new BmobIMUserInfo();
info.setAvatar("填写接收者的头像");
info.setUserId(et_receiver_id.getText().toString());
info.setName("填写接收者的名字");
BmobIM.getInstance().startPrivateConversation(info, new ConversationListener() {
@Override
public void done(BmobIMConversation c, BmobException e) {
if(e==null){
isOpenConversation = true;
//在此跳转到聊天页面或者直接转化
mBmobIMConversation=BmobIMConversation.obtain(BmobIMClient.getInstance(),c);
tv_message.append("发送者:"+et_message.getText().toString()+"\n");
BmobIMTextMessage msg =new BmobIMTextMessage();
msg.setContent(et_message.getText().toString());
mBmobIMConversation.sendMessage(msg, new MessageSendListener() {
@Override
public void done(BmobIMMessage msg, BmobException e) {
if (e != null) {
et_message.setText("");
}else{
}
}
});
}else{
Toast.makeText(MainActivity.this, "开启会话出错", Toast.LENGTH_SHORT).show();
}
}
});
在发送消息之前必须开启一个会话,会话需要传入的参数就是接受者的id、头像、昵称。打开成功后,还需通过BmobIMConversation.obtain将会话转化后才能进行消息的发送。发送代码已贴,其中et_message.getText().toString(),及是你发送消息的内容
接收消息
虽然把消息发出去了,但是你还是无法看到或者接受其他的消息,这时候我们需要集成一个消息接收类,进行消息的接收
public class ImMessageHandler extends BmobIMMessageHandler{
@Override
public void onMessageReceive(MessageEvent messageEvent) {
super.onMessageReceive(messageEvent);
//在线消息
MainActivity.tv_message.append("接收到:"+messageEvent.getMessage().getContent()+"\n");
}
@Override
public void onOfflineReceive(OfflineMessageEvent offlineMessageEvent) {
super.onOfflineReceive(offlineMessageEvent);
//离线消息
}
}
这里自己新建一个类并集成BmobIMMessageHandler,便可接收到其他人发过来的消息。两个方法,读者自行处理数据。结合前面的初始化。把那个BmobIM注册的消息接收器改为你自己新建的类即可。按照步骤过来,这个简单的即时通讯就完成了,我写的这个demo代码量很少,我是直接把bmob的官方文档的主要内容抽离了,想更深层次的学习的,请自行查看官方文档。