02_環(huán)信集成 app 即時(shí)通訊功能基礎(chǔ)

初始化 SDK

在應(yīng)用的 Application 的 onCreate() 方法中做初始化操作定页,同時(shí)我們可以傳入一些設(shè)置好的 options。

 @Override
 public void onCreate() {
    EMOptions options = initChatOptions();
    //初始化
    if(options == null){
            EMClient.getInstance().init(this, initChatOptions());
    } else{
            EMClient.getInstance().init(this, options);
    }
    //在做打包混淆時(shí)酗电,關(guān)閉debug模式魄藕,避免消耗不必要的資源
    EMClient.getInstance().setDebugMode(true);
 }


  private EMOptions initChatOptions(){
    EMOptions options = new EMOptions();
    // 默認(rèn)添加好友時(shí),是不需要驗(yàn)證的撵术,改成需要驗(yàn)證
    options.setAcceptInvitationAlways(false);
    // set if you need read ack
    options.setRequireAck(true);
    // set if you need delivery ack
    options.setRequireDeliveryAck(false);
    // 建議初始化SDK的時(shí)候設(shè)置成每個(gè)會(huì)話默認(rèn)load一條消息背率,節(jié)省加載會(huì)話的時(shí)間
    options.setNumberOfMessagesLoaded(1);

    //you need apply & set your own id if you want to use google cloud messaging.
    options.setGCMNumber("324169311137");
    //you need apply & set your own id if you want to use Mi push notification
    options.setMipushConfig("2882303761517426801", "5381742660801");
}

需要注意的是,如果應(yīng)用中有其它第三方的服務(wù)啟動(dòng)嫩与,那么在初始化環(huán)信 SDK 之前需要添加下面相關(guān)的代碼來防止環(huán)信 SDK 被初始化 2 次寝姿。

appContext = this;
int pid = android.os.Process.myPid();
String processAppName = getAppName(pid);
// 如果APP啟用了遠(yuǎn)程的service,此application:onCreate會(huì)被調(diào)用2次
// 為了防止環(huán)信SDK被初始化2次划滋,加此判斷會(huì)保證SDK被初始化1次
// 默認(rèn)的APP會(huì)在以包名為默認(rèn)的process name下運(yùn)行饵筑,如果查到的process name不是APP的process name就立即返回
if (processAppName == null ||!processAppName.equalsIgnoreCase(appContext.getPackageName())) {
    Log.e(TAG, "enter the service process!");
    // 則此application::onCreate 是被service 調(diào)用的,直接返回
    return;
}
...
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;
}

注冊(cè)

注冊(cè)模式分兩種古毛,開放注冊(cè)(客戶端可以直接注冊(cè))和授權(quán)注冊(cè)翻翩。

  • 開放注冊(cè)是為了測(cè)試使用,正式環(huán)境中不推薦使用該方式注冊(cè)環(huán)信賬號(hào)稻薇;
  • 授權(quán)注冊(cè)的流程是客戶端填寫好注冊(cè)信息后點(diǎn)擊注冊(cè)按鈕嫂冻,注冊(cè)信息提交到應(yīng)用服務(wù)器,應(yīng)用服務(wù)器提供環(huán)信提供的 REST API 進(jìn)行注冊(cè)塞椎,注冊(cè)完成后應(yīng)用服務(wù)器進(jìn)行處理在返回給客戶端注冊(cè)結(jié)果桨仿。

登錄

調(diào)用異步方法 login() 完成登錄。需要注意的是在登錄成功后需要調(diào)用 EMClient.getInstance().chatManager().loadAllConversations();EMClient.getInstance().groupManager().loadAllGroups();這兩個(gè)方法是為了保證進(jìn)入主頁后本地會(huì)話和群組都 load 完畢案狠。

EMClient.getInstance().login(userName,password,new EMCallBack() {//回調(diào)
    @Override
    public void onSuccess() {
        EMClient.getInstance().groupManager().loadAllGroups();
        EMClient.getInstance().chatManager().loadAllConversations();
            Log.d("main", "登錄聊天服務(wù)器成功服傍!");        
    }

    @Override
    public void onProgress(int progress, String status) {

    }

    @Override
    public void onError(int code, String message) {
        Log.d("main", "登錄聊天服務(wù)器失敗骂铁!");
    }
});

另外如果登錄過吹零,我們需要在應(yīng)用的歡迎界面中還要加入上面兩個(gè)方法來保證進(jìn)入主頁后本地會(huì)話和群組都 load 完畢。

在 SplashActivity 類中

if(isLoggedIn()) {
  EMClient.getInstance().chatManager().loadAllConversations();
  EMClient.getInstance().groupManager().loadAllGroups();
  ...
  startActivity(new Intent(SplashActivity.this, MainActivity.class));
}

public boolean isLoggedIn() {
  return EMClient.getInstance().isLoggedInBefore();
}

在我們首次登錄成功后拉庵,不需要再次調(diào)用登錄方法灿椅。在下次應(yīng)用啟動(dòng)時(shí),環(huán)信 SDK 會(huì)自動(dòng)完成登錄钞支。如果自動(dòng)登錄失敗茫蛹,也會(huì)讀取之前的會(huì)話信息。

自動(dòng)登錄在下面幾種情況下會(huì)被取消:

  • 用戶調(diào)用了 SDK 的登出動(dòng)作烁挟;
  • 用戶在別的設(shè)備上更改了密碼婴洼,導(dǎo)致此設(shè)備上自動(dòng)登錄失敗撼嗓;
  • 用戶的賬號(hào)被從服務(wù)器端刪除柬采;
  • 用戶從另一個(gè)設(shè)備登錄欢唾,把當(dāng)前設(shè)備上登錄的用戶踢出。

退出登錄

// 異步方法
EMClient.getInstance().logout(true, new EMCallBack() {   
    @Override
    public void onSuccess() {
        // TODO Auto-generated method stub
        
    }
    @Override
    public void onProgress(int progress, String status) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public void onError(int code, String message) {
        // TODO Auto-generated method stub
        
    }
});

有時(shí)候在執(zhí)行退出登錄時(shí)警没,由于網(wǎng)絡(luò)問題而導(dǎo)致賬號(hào)解綁失敗匈辱,即使界面退出,但還會(huì)收到消息的現(xiàn)象杀迹。為了避免這種情況的發(fā)生亡脸,我們可以在應(yīng)用選擇退出時(shí)彈出對(duì)話框顯示當(dāng)前網(wǎng)絡(luò)是否正常以及提示退出的風(fēng)險(xiǎn)(繼續(xù)退出可能還會(huì)收到消息)。

需要注意的是树酪,如果調(diào)用異步退出方法浅碾,在收到 onSuccess() 的回調(diào)后才去調(diào)用 IM 相關(guān)的方法,比如 login续语。

注冊(cè)連接監(jiān)聽

當(dāng)?shù)艟€時(shí)垂谢,Android SDK 會(huì)自動(dòng)重連,無需進(jìn)行任何操作疮茄,通過注冊(cè)連接監(jiān)聽來知道連接狀態(tài)滥朱。根據(jù) onDisconnected() 方法返回的 error 判斷賬號(hào)連接失敗的原因。

//注冊(cè)一個(gè)監(jiān)聽連接狀態(tài)的listener
EMClient.getInstance().addConnectionListener(new MyConnectionListener());

//實(shí)現(xiàn)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){
                    // 顯示帳號(hào)已經(jīng)被移除
                }else if (error == EMError.USER_LOGIN_ANOTHER_DEVICE) {
                    // 顯示帳號(hào)在其他設(shè)備登錄
                } else {
                if (NetUtils.hasNetwork(MainActivity.this))
                    //連接不到環(huán)信聊天服務(wù)器
                else
                    //當(dāng)前網(wǎng)絡(luò)不可用力试,請(qǐng)檢查網(wǎng)絡(luò)設(shè)置
                }
            }
        });
    }
}

文章只是作為自己記錄學(xué)習(xí)使用徙邻,如果有使用不當(dāng)?shù)牡胤娇梢訞我,謝謝畸裳。

參考文章:環(huán)信開發(fā)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缰犁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怖糊,更是在濱河造成了極大的恐慌帅容,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍伤,死亡現(xiàn)場(chǎng)離奇詭異并徘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扰魂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門麦乞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阅爽,你說我怎么就攤上這事路幸〖隹” “怎么了付翁?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晃听。 經(jīng)常有香客問我百侧,道長(zhǎng)砰识,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任佣渴,我火速辦了婚禮辫狼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辛润。我一直安慰自己膨处,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布砂竖。 她就那樣靜靜地躺著真椿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乎澄。 梳的紋絲不亂的頭發(fā)上突硝,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音置济,去河邊找鬼解恰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浙于,可吹牛的內(nèi)容都是我干的护盈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼路媚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼黄琼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起整慎,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤脏款,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后裤园,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撤师,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拧揽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剃盾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淤袜,死狀恐怖痒谴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铡羡,我是刑警寧澤积蔚,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站烦周,受9級(jí)特大地震影響尽爆,放射性物質(zhì)發(fā)生泄漏怎顾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一漱贱、第九天 我趴在偏房一處隱蔽的房頂上張望槐雾。 院中可真熱鬧,春花似錦幅狮、人聲如沸募强。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钻注。三九已至,卻和暖如春配猫,著一層夾襖步出監(jiān)牢的瞬間幅恋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工泵肄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捆交,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓腐巢,卻偏偏與公主長(zhǎng)得像品追,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冯丙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容