环信为自己的app加入即时通信功能的流程

来源:互联网 发布:如何建立图片数据库 编辑:程序博客网 时间:2024/05/18 03:18

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 -->

        <serviceandroid:name="com.easemob.chat.EMChatService"/>

同时在proguard文件中加入以下keep:

-keepclasscom.easemob.**{*;}
-keepclassorg.jivesoftware.**{*;}
-keepclassorg.apache.**{*;}
-dontwarn  com.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);
              EMConversation      conversation=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() {

                    publicvoid 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);

 

1 15
原创粉丝点击