環信集成全過程有demo

寫在前面:普通的應用中一般只用到傳輸文件,發送文字圖片信息,所以此處不做語音視頻通訊的集成,夠用就行,紅色字體基本是都是坑,大家注意了

由於easeui bug太多,集成繁瑣,不符合項目要求,所以自己寫了一個,界面也是自己寫的,其實自己寫挺容易的,沒想象的難,多看看官方文檔,其實挺詳細的,方法的使用也很簡單,有點耐心是完全沒問題的,主要是準備工作需要做好了,下面我寫的很詳細,但是後面的不詳細,大家參照官方文檔吧,肯定沒問題的

1.準備工作

  1. 註冊賬號下載sdk等,官網說的很明確,我就不囉嗦了
  2. jar文件,so文件引入,如下圖,文件路徑不要弄錯了,當然可以有其他方法,但這是最簡單的方式,這樣的文件路徑她會自動識別jar文件和so文件
  3. 配置清單文件,配置自己的appkey(只有這一個是需要自己配置的,其他複製即可)即可其他都不需要手動配置直接複製,官網上直接複製代碼即可
  4. 引入easeui庫,huanxin_IM_sdk_V3.1.2r2\examples\easeui在這個目錄下,把easeui文件夾單獨複製出來,引入步驟如下,然後必須需在project structure菜單下面添加module依賴,否則報錯
  5. 初始化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下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章