國際慣例,先上效果圖

Github代碼地址
環(huán)信SDK開發(fā)文檔
部分代碼
Application中初始化:
var options = EMOptions()
// 默認(rèn)添加好友時,是不需要驗證的,改成需要驗證
options.acceptInvitationAlways = false
// 是否自動將消息附件上傳到環(huán)信服務(wù)器,默認(rèn)為True是使用環(huán)信服務(wù)器上傳下載,如果設(shè)為 false,需要開發(fā)者自己處理附件消息的上傳和下載
options.autoTransferMessageAttachments = true
// 是否自動下載附件類消息的縮略圖等,默認(rèn)為 true 這里和上邊這個參數(shù)相關(guān)聯(lián)
options.setAutoDownloadThumbnail(true)
//初始化
EMClient.getInstance().init(applicationContext, options)
//在做打包混淆時,關(guān)閉debug模式,避免消耗不必要的資源
EMClient.getInstance().setDebugMode(true)
鏈接狀態(tài)監(jiān)聽listener :
open class ConnectionListener : EMConnectionListener {
override fun onConnected() {
Log.i("minfo", "賬號連接成功")
}
override fun onDisconnected(errorCode: Int) {
when(errorCode) {
EMError.USER_REMOVED ->
Log.i("minfo", "用戶已被刪除")
EMError.USER_LOGIN_ANOTHER_DEVICE ->
Log.i("minfo", "異地登錄被擠掉")
}
}
}
賬號注冊:
//注意:這里的注冊有個坑,必須要在子線程中才可以,否則會拋出異常
Thread {
kotlin.run {
//注冊賬號,注冊失敗會拋出HyphenateException: Registration failed.
//比如重復(fù)注冊,比如在子線程中注冊
try {
EMClient.getInstance().createAccount(userId, psd) //同步方法
} catch (e: Exception) {
Log.i("minfo", "賬號已存在")
}
runOnUiThread {
//賬號登錄
login()
}
}
}.start()
登錄:
EMClient.getInstance().login(userId, userPsd, object: EMCallBack {
override fun onSuccess() {
Log.i("minfo", "登錄聊天服務(wù)器成功")
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
}
override fun onProgress(progress: Int, status: String?) {
}
override fun onError(code: Int, error: String?) {
Log.i("minfo", "登錄聊天服務(wù)器失敗")
}
})
退出登錄:
EMClient.getInstance().logout(true, object: EMCallBack {
override fun onSuccess() {
Log.i("minfo", "退出登錄成功")
}
override fun onProgress(progress: Int, status: String?) {
}
override fun onError(code: Int, error: String?) {
Log.i("minfo", "退出登錄失敗")
}
})
EaseUI 使用指南
EaseUI 是一個 UI 庫,封裝了 IM 功能常用的控件、fragment 等等,旨在幫助開發(fā)者快速集成環(huán)信 SDK。
- 會話列表頁面:EaseConversationListFragment
conversationListFragment = new EaseConversationListFragment();
conversationListFragment.setConversationListItemClickListener(new EaseConversationListItemClickListener() {
@Override
public void onListItemClicked(EMConversation conversation) {
startActivity(new Intent(MainActivity.this, ChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, conversation.getUserName()));
}
});
- 聯(lián)系人列表EaseContactListFragment
contactListFragment= new EaseContactListFragment();
//需要設(shè)置聯(lián)系人列表才能啟動fragment
contactListFragment.setContactsMap(getContacts());
//設(shè)置item點擊事件
contactListFragment.setContactListItemClickListener(new EaseContactListItemClickListener() {
@Override
public void onListItemClicked(EaseUser user) {
startActivity(new Intent(MainActivity.this, ChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, user.getUsername()));
}
});
- 聊天頁面:EaseChatFragment
val chatFragment = EaseChatFragment()
val args = Bundle()
args.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE)
args.putString(EaseConstant.EXTRA_USER_ID, userId)
chatFragment.arguments = args
supportFragmentManager.beginTransaction().add(R.id.flChat, chatFragment).commit()