1. 程式人生 > >環信即時通訊的理解

環信即時通訊的理解

近來公司要做環信的即時通訊,發現公司想要聊天的功能基本上QQ都有,這樣就顯得有點不怎麼現實:人家作幾年?咱才多少時間?算了,還好環信也做了幾年了。走多遠就看自己在這個功能裡泡多久吸收多少,有點耐心總能把這段路走完。

 整合環信有兩種方法,

1 整合環信的SDK,好處是可以用環信的功能,自己的介面 2 引用EaseUI,好處是使用環信的介面和功能,節約時間。 兩種方法各有千秋,看自己的選擇。 本來是懶省事整合的整個環信的demo,修改頁面新增自己的功能。但是公司新來的大神要求有自己的特色,不得不重新來過選擇整合sdk使用功能和自定義介面。 http://www.imgeek.org/video/44    環信的sdk視訊教程。當然,我寫的是自己的理解謝謝。
提前準備: 1 加入SDK以後,需要appkey的配置。 2 初始化,需要放在其他sdk初始化方法之前,也就是說環信的sdk初始化是第一個。 初始化方法: EMClient.getInstance().init(context,options); 其中Options這個引數主要SDK初始化的一些配置,這裡可以配置一些初始化SDK的定義,比如 //設定自動登入  opthions.setAutoLogin(true); //設定(主動或者被動)退出群組的時候,是否刪除群聊天記錄 options.setDeleteMessageAsExitGroup(false); 為什麼不刪除?人家的聊天畢竟是人家的,能不刪就別刪。 其他詳細需要檢視的,API文件:  http://www.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1chat_1_1_e_m_options.html
註冊於登入: 註冊的方法,是同步的,需要自己有執行,根據執行情況判斷是否註冊成功 EMClitent,getInstance().createAccount( 名稱,密碼);//一般放在伺服器執行。 登入方法,非同步,可在回撥中監聽登入狀態 EMClient.getInstance().login(名字,密碼,callback); 退出登入的方法,第一個引數表示是否解綁推送的token,沒有使用推送或者被踢都要傳false EMCliten.getInstance().logout(false,callback); 整合聊天: 聊天主要就是訊息的接受和傳送: 傳送比較簡單,只要建立訊息,呼叫傳送方法就可以。 接受需要實現訊息的箭筒藉口EMMessageListener, 這個監聽介面可以在多處實現。
一般是在全域性一個實現,一個是在聊天介面。這裡主要在聊天介面實現: 實現這個介面需要實現幾個藉口的方法: //收到訊息 public void onMessageReceived(List<Message> list); //收到新的CMD訊息 public void onCMDMessageReceived(List<Message> list); //收到新的已讀回執 public void onMessageReadAckReceived(List<Message> list); //收到新的傳送回執 public void onMessageDeliveryAckReceived(List<Message> list); //訊息的狀態改變 public void onMessageChanged(EMMessage message,Object object); Github 程式碼地址 https://github.com/lzan13/EaseChat         注意  master是整合SDK的。 下載SDK之後解壓,doc檔案是環信的離線文件,方便離線檢視。 libs是包含環信的聊天和及時語音和視訊通話功能,現在就是要用這裡的jar包 copy  jar包和so庫檔案,x86是給模擬器用的。 因為用studio的時候懶得去見jni,所以需要去配置一下:  看好位置

  開始配置專案 根據官方文件: 1 許可權   2 需要的服務 3 appkey 準備工作完成以後,同步一下就開始寫程式碼 1  初始化SDK,需要在自定義的Application中寫,這樣就可以執行就初始化。    
public class MyApplication extends Application {

    private Context context;
    private String TAG = "log";
@Override
public void onCreate() {
        super.onCreate();
initDate();
initView();
} private void initDate() { context = this; int pid = android.os.Process.myPid(); String processAppName = getAppName(pid); // 如果APP啟用了遠端的service,此application:onCreate會被呼叫2次 // 為了防止環信SDK被初始化2次,加此判斷會保證SDK被初始化1次 // 預設的APP會在以包名為預設的process name下執行,如果查到的process name不是APP的process name就立即返回 if (processAppName == null ||!processAppName.equalsIgnoreCase(context.getPackageName())) { Log.e(TAG, "enter the service process!"); // 則此application::onCreate 是被service 呼叫的,直接返回 return; } } private void initView() { EMOptions options = new EMOptions(); // 預設新增好友時,是不需要驗證的,改成需要驗證 options.setAcceptInvitationAlways(false); //初始化 EMClient.getInstance().init(this, options); //在做打包混淆時,關閉debug模式,避免消耗不必要的資源 EMClient.getInstance().setDebugMode(true); } private String getAppName(int pID) { String processName = null; ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List l = am.getRunningAppProcesses(); Iterator i = l.iterator(); PackageManager pm = this.getPackageManager(); while (i.hasNext()) { ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next()); try { if (info.pid == pID) { processName = info.processName; return processName; } } catch (Exception e) { // Log.d("Process", "Error>> :"+ e.toString()); } } return processName; } }
寫完記得在清單檔案中宣告這個自定義的Application。
android:name=".application.MyApplication"

2  第二步開始寫登入和註冊的介面,自己剛開始沒必要做多完美先坐在同一個介面。怎麼寫就不說了 註冊是個同步的方法,需要非同步處理,在點選開始註冊的時候開啟子執行緒。 登入不用開啟子執行緒,注意不論是註冊還是登陸失敗的時候都需要處理下列印個日誌。