1. 在环信官网上注册账号,创建自己的app,生成app的key
2. 下载环信的SDK开发包,并导入到自己的app中并在自己的app的AndroidManifest.xml文件中加入步骤1中的key,并加入权限
具体代码为:
<!--Required -->
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permissionandroid:name="android.permission.GET_TASKS" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.WAKE_LOCK" />
<uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />
<!-- 设置环信应用的appkey -->
<meta-data
android:name="EASEMOB_APPKEY"
android:value="appkey" />
<!-- 声明sdk所需的service -->
<service android:name="com.easemob.chat.EMChatService" />
同时在在proguard文件中加入以下keep:
-keepclasscom.easemob.**{*;}
-keepclassorg.jivesoftware.**{*;}
-keepclassorg.apache.**{*;}
-dontwarn
com.easemob.**
#2.0.9后的不需要加下面这个keep
#-keepclassorg.xbill.DNS.**{*;}
#另外,demo中发送表情的时候使用到反射,需要keepSmileUtils,注意前面的包名,
#不要SmileUtils复制到自己的项目下keep的时候还是写的demo里的包名
-keepclasscom.easemob.chatuidemo.utils.SmileUtils{*;}
#2.0.9后加入语音通话功能,如需使用此功能的api,加入以下keep
-dontwarnch.imvs.**
-dontwarnorg.slf4j.**
-keepclassorg.ice4j.**{*;}
-keepclassnet.java.sip.**{*;}
-keepclassorg.webrtc.voiceengine.**{*;}
-keepclassorg.bitlet.**{*;}
-keepclassorg.slf4j.**{*;}
-keepclassch.imvs.**{*;}
3.初始化SDK
环信提供抽象类HxSDKHelper,开发人员可以选择继承这个环信SDK帮助类去加快初始化集成速度。此类会初始化环信SDK,并设置初始化参数和初始化相应的监听器
* 不过继承类需要根据要求求提供相应的函数,尤其是提供一个{@link HXSDKModel}. 所以请实现abstract protectedHXSDKModel createModel();
* 全局仅有一个此类的实例存在,所以可以在任意地方通过getInstance()函数获取此全局实例
创建继承Application的类,并在OnCreate()方法中初始化SDK。
applicationContext = this;
instance = this;
/**
* this function will initialize theHuanXin SDK
*
* @return boolean true if caller cancontinue to call HuanXin related APIs after calling onInit, otherwise false.
*
* 环信初始化SDK帮助函数
* 返回true如果正确初始化,否则false,如果返回为false,请在后续的调用中不要调用任何和环信相关的代码
*
* for example:
* 例子:
*
* public class DemoHXSDKHelper extendsHXSDKHelper
*
* HXHelper = new DemoHXSDKHelper();
* if(HXHelper.onInit(context)){
* // do HuanXin related work
* }
*/
hxSDKHelper.onInit(applicationContext);
初始化时注册接收新消息的监听广播
//只有注册了广播才能接收到新消息,目前离线消息,在线消息都是走接收消息的广播(离线消息目前无法监听,在登录以后,接收消息广播会执行一次拿到所有的离线消息)
NewMessageBroadcastReceivermsgReceiver=newNewMessageBroadcastReceiver();
IntentFilterintentFilter=newIntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver,intentFilter);
privateclassNewMessageBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
// 注销广播
abortBroadcast();
// 消息id(每条消息都会生成唯一的一个id,目前是SDK生成)
StringmsgId=intent.getStringExtra("msgid");
//发送方
Stringusername=intent.getStringExtra("from");
// 收到这个广播的时候,message已经在db和内存里了,可以通过id获取mesage对象
EMMessagemessage=EMChatManager.getInstance().getMessage(msgId);
EMConversation
conversation=EMChatManager.getInstance().getConversation(username);
// 如果是群聊消息,获取到group id
if(message.getChatType()==ChatType.GroupChat){
username=message.getTo();
}
if(!username.equals(username)){
// 消息不是发给当前会话,return
return;
}
}
}
4注册用户
// 调用sdk注册方法 EMChatManager.getInstance().createAccountOnServer(
username, pwd);
runOnUiThread(new Runnable() {
public void run() {
if (!MeActivity.this.isFinishing())
//pd.dismiss();
// 保存用户名
HealthFileApp.getInstance().setUserName(
username);
Toast.makeText(
getApplicationContext(),
getResources()
.getString(
R.string.Registered_successfully),
0).show();
finish();
}
});
5.登陆
// 调用sdk登陆方法登陆聊天服务器
EMChatManager.getInstance().login(currentUsername, currentPassword,new EMCallBack() {
@Override
public void onSuccess() {
if (!progressShow) {
return;
}
// 登陆成功,保存用户名密码
HealthFileApp.getInstance()
.setUserName(currentUsername);
HealthFileApp.getInstance()
.setPassword(currentPassword);
try {
// ** 第一次登录或者之前logout后再登录,加载所有本地群和回话
// ** manually load all localgroups and EMGroupManager.getInstance().loadAllGroups(); EMChatManager.getInstance().loadAllConversations();
// 处理好友和群组
initializeContacts();
6.实现聊天Activity
获得与聊天人的coversation会话,并将要发送的消息放到会话中。
EMConversationconversation=EMChatManager.getInstance().getConversation(username);