1. 程式人生 > >環信為自己的app加入即時通訊功能的流程

環信為自己的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);