環信為自己的app加入即時通訊功能的流程
1. 在環信官網上註冊賬號,建立自己的app,生成app的key
2. 下載環信的SDK開發包,並匯入到自己的app中並在自己的app的AndroidManifest.xml檔案中加入步驟1中的key,並加入許可權
具體程式碼為:
<!--Required -->
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permissionandroid:name="android.permission.GET_TASKS" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.WAKE_LOCK" />
<uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />
<!-- 設定環信應用的appkey -->
<meta-data
android:name="EASEMOB_APPKEY"
android:value="appkey" />
<!-- 宣告sdk所需的service -->
<service android:name="com.easemob.chat.EMChatService" />
同時在在proguard檔案中加入以下keep:
-keepclasscom.easemob.**{*;}
-keepclassorg.jivesoftware.**{*;}
-keepclassorg.apache.**{*;}
-dontwarncom.easemob.**
#2.0.9後的不需要加下面這個keep
#-keepclassorg.xbill.DNS.**{*;}
#另外,demo中傳送表情的時候使用到反射,需要keepSmileUtils,注意前面的包名,
#不要SmileUtils複製到自己的專案下keep的時候還是寫的demo裡的包名
-keepclasscom.easemob.chatuidemo.utils.SmileUtils{*;}
#2.0.9後加入語音通話功能,如需使用此功能的api,加入以下keep
-dontwarnch.imvs.**
-dontwarnorg.slf4j.**
-keepclassorg.ice4j.**{*;}
-keepclassnet.java.sip.**{*;}
-keepclassorg.webrtc.voiceengine.**{*;}
-keepclassorg.bitlet.**{*;}
-keepclassorg.slf4j.**{*;}
-keepclassch.imvs.**{*;}
3.初始化SDK
環信提供抽象類HxSDKHelper,開發人員可以選擇繼承這個環信SDK幫助類去加快初始化整合速度。此類會初始化環信SDK,並設定初始化引數和初始化相應的監聽器
* 不過繼承類需要根據要求求提供相應的函式,尤其是提供一個{@link HXSDKModel}. 所以請實現abstract protectedHXSDKModel createModel();
* 全域性僅有一個此類的例項存在,所以可以在任意地方通過getInstance()函式獲取此全域性例項
建立繼承Application的類,並在OnCreate()方法中初始化SDK。
applicationContext = this;
instance = this;
/**
* this function will initialize theHuanXin SDK
*
* @return boolean true if caller cancontinue to call HuanXin related APIs after calling onInit, otherwise false.
*
* 環信初始化SDK幫助函式
* 返回true如果正確初始化,否則false,如果返回為false,請在後續的呼叫中不要呼叫任何和環信相關的程式碼
*
* for example:
* 例子:
*
* public class DemoHXSDKHelper extendsHXSDKHelper
*
* HXHelper = new DemoHXSDKHelper();
* if(HXHelper.onInit(context)){
* // do HuanXin related work
* }
*/
hxSDKHelper.onInit(applicationContext);
初始化時註冊接收新訊息的監聽廣播
//只有註冊了廣播才能接收到新訊息,目前離線訊息,線上訊息都是走接收訊息的廣播(離線訊息目前無法監聽,在登入以後,接收訊息廣播會執行一次拿到所有的離線訊息)
NewMessageBroadcastReceivermsgReceiver=newNewMessageBroadcastReceiver();
IntentFilterintentFilter=newIntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());
intentFilter.setPriority(3);
registerReceiver(msgReceiver,intentFilter);
privateclassNewMessageBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
// 登出廣播
abortBroadcast();
// 訊息id(每條訊息都會生成唯一的一個id,目前是SDK生成)
StringmsgId=intent.getStringExtra("msgid");
//傳送方
Stringusername=intent.getStringExtra("from");
// 收到這個廣播的時候,message已經在db和記憶體裡了,可以通過id獲取mesage物件
EMMessagemessage=EMChatManager.getInstance().getMessage(msgId);
EMConversationconversation=EMChatManager.getInstance().getConversation(username);
// 如果是群聊訊息,獲取到group id
if(message.getChatType()==ChatType.GroupChat){
username=message.getTo();
}
if(!username.equals(username)){
// 訊息不是發給當前會話,return
return;
}
}
}
4註冊使用者
// 呼叫sdk註冊方法 EMChatManager.getInstance().createAccountOnServer(
username, pwd);
runOnUiThread(new Runnable() {
public void run() {
if (!MeActivity.this.isFinishing())
//pd.dismiss();
// 儲存使用者名稱
HealthFileApp.getInstance().setUserName(
username);
Toast.makeText(
getApplicationContext(),
getResources()
.getString(
R.string.Registered_successfully),
0).show();
finish();
}
});
5.登陸
// 呼叫sdk登陸方法登陸聊天伺服器
EMChatManager.getInstance().login(currentUsername, currentPassword,new EMCallBack() {
@Override
public void onSuccess() {
if (!progressShow) {
return;
}
// 登陸成功,儲存使用者名稱密碼
HealthFileApp.getInstance()
.setUserName(currentUsername);
HealthFileApp.getInstance()
.setPassword(currentPassword);
try {
// ** 第一次登入或者之前logout後再登入,載入所有本地群和回話
// ** manually load all localgroups and EMGroupManager.getInstance().loadAllGroups(); EMChatManager.getInstance().loadAllConversations();
// 處理好友和群組
initializeContacts();
6.實現聊天Activity
獲得與聊天人的coversation會話,並將要傳送的訊息放到會話中。
EMConversationconversation=EMChatManager.getInstance().getConversation(username);