寫在前面:普通的應用中一般只用到傳輸文件,發送文字圖片信息,所以此處不做語音視頻通訊的集成,夠用就行,紅色字體基本是都是坑,大家注意了
由於easeui bug太多,集成繁瑣,不符合項目要求,所以自己寫了一個,界面也是自己寫的,其實自己寫挺容易的,沒想象的難,多看看官方文檔,其實挺詳細的,方法的使用也很簡單,有點耐心是完全沒問題的,主要是準備工作需要做好了,下面我寫的很詳細,但是後面的不詳細,大家參照官方文檔吧,肯定沒問題的
1.準備工作
- 註冊賬號下載sdk等,官網說的很明確,我就不囉嗦了
- jar文件,so文件引入,如下圖,文件路徑不要弄錯了,當然可以有其他方法,但這是最簡單的方式,這樣的文件路徑她會自動識別jar文件和so文件
- 配置清單文件,配置自己的appkey(只有這一個是需要自己配置的,其他複製即可)即可其他都不需要手動配置直接複製,官網上直接複製代碼即可
- 引入easeui庫,huanxin_IM_sdk_V3.1.2r2\examples\easeui在這個目錄下,把easeui文件夾單獨複製出來,引入步驟如下,然後必須需在project structure菜單下面添加module依賴,否則報錯
- 初始化sdk,參考環信官網指南,已經很詳細了,而且也很簡單,記得要在清單文件中配置自己的application類
2.註冊,登錄
1.註冊,引用一下官方的說法
註冊模式分兩種,開放註冊和授權註冊。只有開放註冊時,纔可以客戶端註冊。
開放註冊是爲了測試使用,正式環境中不推薦使用該方式註冊環信賬號;
授權註冊的流程應該是您服務器通過環信提供的 REST API 註冊,之後保存到您的服務器或返回給客戶端。
註冊用戶名會自動轉爲小寫字母,所以建議用戶名均以小寫註冊。(強烈建議開發者通過後臺調用 REST 接口去註冊環信 ID,客戶端註冊方法不提倡使用。)
//註冊失敗會拋出HyphenateException
EMClient.getInstance().createAccount(username, pwd);//同步方法
2.登錄,同樣官方很詳細注意: 登錄成功後需要調用EMClient.getInstance().chatManager().loadAllConversations(); 和EMClient.getInstance().groupManager().loadAllGroups();。
以上兩個方法是爲了保證進入主頁面後本地會話和羣組都 load 完畢。
另外如果登錄過,APP 長期在後臺再進的時候也可能會導致加載到內存的羣組和會話爲空,可以在主頁面的 oncreate 裏也加上這兩句代碼,當然,更好的辦法應該是放在程序的開屏頁,可參考 Demo 的 SplashActivity。
EMClient.getInstance().login(userName,password,new EMCallBack() {//回調
@Override
public void onSuccess() {
runOnUiThread(new Runnable() {
public void run() {
EMClient.getInstance().groupManager().loadAllGroups();
EMClient.getInstance().chatManager().loadAllConversations();
Log.d("main", "登錄聊天服務器成功!");
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
Log.d("main", "登錄聊天服務器失敗!");
}
});
自動登錄
即首次登錄成功後,不需要再次調用登錄方法,在下次 APP 啓動時,SDK 會自動爲您登錄。並且如果您自動登錄失敗,也可以讀取到之前的會話信息(以上情況是在未調用登出的情況下實現的)。
SDK 中自動登錄屬性默認是 true 打開的,如果不需要自動登錄,在初始化 SDK 初始化的時候,調用options.setAutoLogin(false);設置爲 false 關閉。
自動登錄在以下幾種情況下會被取消:
用戶調用了 SDK 的登出動作;
用戶在別的設備上更改了密碼,導致此設備上自動登錄失敗;
用戶的賬號被從服務器端刪除;
用戶從另一個設備登錄,把當前設備上登錄的用戶踢出。
登錄頁面loginActivity代碼如下:
package com.z.hx;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.hyphenate.EMCallBack;
import com.hyphenate.EMError;
import com.hyphenate.chat.EMClient;
import com.hyphenate.exceptions.HyphenateException;
import com.z.hx.utils.ToastUtil;
public class LoginActivity extends AppCompatActivity {
private android.widget.EditText etusername;
private android.widget.EditText etpassword;
private android.widget.Button btnlogin;
private android.widget.Button btnregist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
this.btnlogin = (Button) findViewById(R.id.login);
this.etpassword = (EditText) findViewById(R.id.pwd);
this.etusername = (EditText) findViewById(R.id.uname);
this.btnregist = (Button) findViewById(R.id.regist);
btnlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//登錄成功進入到回話列表頁面
EMClient.getInstance().login(etusername.getText().toString(), etpassword.getText().toString(), new EMCallBack() {//回調
@Override
public void onSuccess() {
runOnUiThread(new Runnable() {
public void run() {
EMClient.getInstance().groupManager().loadAllGroups();
EMClient.getInstance().chatManager().loadAllConversations();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
ToastUtil.showToast(getApplicationContext(), "登錄成功");
Log.d("main", "登錄聊天服務器成功!");
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, String message) {
Log.d("main", "登錄聊天服務器失敗!");
}
});
}
});
btnregist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//註冊成功之後提示成功,失敗就提示失敗,以及失敗原因
//註冊失敗會拋出HyphenateException
try {
EMClient.getInstance().createAccount(etusername.getText().toString(), etpassword.getText().toString());//同步方法
ToastUtil.showToast(getApplicationContext(), "註冊成功,用戶名是:" + etusername.getText().toString() + ",開始暢快聊天吧");
} catch (HyphenateException e) {
e.printStackTrace();
//此處我們根據錯誤類型可以判斷是什麼原因引起的註冊失敗,我們只列出常見的原因1.網絡連接失敗2.用戶名已註冊
//http://www.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1_e_m_error.html這是官方的文檔,這裏有各種錯誤代碼,供我們參考
switch (e.getErrorCode()) {
case EMError.SERVER_BUSY:
case EMError.SERVER_UNKNOWN_ERROR:
case EMError.SERVER_NOT_REACHABLE:
case EMError.SERVER_TIMEOUT:
case EMError.NETWORK_ERROR://網絡錯誤
ToastUtil.showToast(getApplicationContext(), "網絡有問題,請稍後再試");
break;
case EMError.USER_ALREADY_EXIST://用戶名已存在
ToastUtil.showToast(getApplicationContext(), "用戶名已存在,請嘗試登錄");
break;
case EMError.USER_REG_FAILED://註冊失敗
Toast.makeText(getApplicationContext(), "註冊失敗", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
});
}
}
坑:在登錄成功是彈出toast不成功,直接崩潰
原因:登錄註冊方法是在子線程中運行的,toast在子線程不成功,可以自己判斷是否在子線程然後再toast,後面會專門寫這個專題,這裏不多說了
3.聊天界面開發
首先:註冊連接狀態監聽
當掉線時,Android SDK 會自動重連,無需進行任何操作,通過註冊連接監聽來知道連接狀態。
在聊天過程中難免會遇到網絡問題,在此 SDK 爲您提供了網絡監聽接口,實時監聽
可以根據 disconnect 返回的 error 判斷原因。若服務器返回的參數值爲EMError.USER_LOGIN_ANOTHER_DEVICE,則認爲是有同一個賬號異地登錄;若服務器返回的參數值爲EMError.USER_REMOVED,則是賬號在後臺被刪除。
//註冊一個監聽連接狀態的listener
EMClient.getInstance().addConnectionListener(new MyConnectionListener());
//實現ConnectionListener接口
private class MyConnectionListener implements EMConnectionListener {
@Override
public void onConnected() {
}
@Override
public void onDisconnected(final int error) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(error == EMError.USER_REMOVED){
// 顯示帳號已經被移除
}else if (error == EMError.USER_LOGIN_ANOTHER_DEVICE) {
// 顯示帳號在其他設備登錄
} else {
if (NetUtils.hasNetwork(MainActivity.this))
//連接不到聊天服務器
else
//當前網絡不可用,請檢查網絡設置
}
}
});
}
}
坑:appkey一定要寫對,要不然一進去就會崩,在application類中就崩了,一般集成第三方的東西都是這樣的,但是環信比較奇葩不告訴你是appkey不對,讓你猜的,哎
剩下的內容我就不貼出來了,有demo環信集成demo下載