集成EaseUI3.0 在线消息和离线消息

集成环信的过程中,遇到各种坑,各种折磨。至于环信文档神马的我就不吐槽了。

EaseUI3.0作为Moduel导入,


image.png

一些不要的so文件该去掉,还是去掉吧,apk 会很大的有木有,

1.在线消息

1.1 简单的会话列表
在你新建的Activiy或者Fragment 如下代码

 conversationListFragment = new EaseConversationListFragment();
        conversationListFragment.setConversationListItemClickListener(new EaseConversationListFragment.EaseConversationListItemClickListener() {

            @Override
            public void onListItemClicked(EMConversation conversation) {
                startActivity(new Intent(CustomeServiceActivity.this, EMChatActivity.class).putExtra(EaseConstant.EXTRA_USER_ID, conversation.conversationId()));
            }
        });
        getSupportFragmentManager().beginTransaction().add(R.id.container, conversationListFragment).commit();

第一个坑(也怪自己理解能力弱,弱鸡~),在其他人发过来消息,这个列表上出现,红色小圆点badge。这个时候,我直接去环信官网扒文档,扒出如下代码

EMClient.getInstance().chatManager().addMessageListener(msgListener);
EMMessageListener msgListener = new EMMessageListener() {
    
    @Override
    public void onMessageReceived(List<EMMessage> messages) {
        //收到消息
    }
    
    @Override
    public void onCmdMessageReceived(List<EMMessage> messages) {
        //收到透传消息
    }
    
    @Override
    public void onMessageRead(List<EMMessage> messages) {
        //收到已读回执
    }
    
    @Override
    public void onMessageDelivered(List<EMMessage> message) {
        //收到已送达回执
    }
    
    @Override
    public void onMessageChanged(EMMessage message, Object change) {
        //消息状态变动
    }
};

记得在不需要的时候移除listener,如在activity的onDestroy()时
EMClient.getInstance().chatManager().removeMessageListener(msgListener);

然而如此设置 没卵用啊,又去论坛问,没有回应,最后还是摸索出来了...
正确如下:

onResume

    @Override
    protected void onResume() {
        super.onResume();
        EaseUI.getInstance().pushActivity(this);
        EMClient.getInstance().chatManager().addMessageListener(msgListener);
    }

onStop

 @Override
    protected void onStop() {
        EMClient.getInstance().chatManager().removeMessageListener(msgListener);
        EaseUI.getInstance().popActivity(this);
        super.onStop();
    }

设置监听

 EMMessageListener msgListener = new EMMessageListener() {

        @Override
        public void onMessageReceived(List<EMMessage> messages) {
            //收到消息
            for (EMMessage message : messages) {
                EaseUI.getInstance().getNotifier().onNewMsg(message);
            }
            refreshUIWithMessage();
        }

        @Override
        public void onCmdMessageReceived(List<EMMessage> messages) {
            //收到透传消息
            LogHelper.trace("状态"+messages.get(0).getUserName()+",时间"+messages.get(0).getMsgTime());
        }

        @Override
        public void onMessageRead(List<EMMessage> messages) {
            //收到已读回执
        }

        @Override
        public void onMessageDelivered(List<EMMessage> message) {
            //收到已送达回执
        }

        @Override
        public void onMessageChanged(EMMessage message, Object change) {
            //消息状态变动
            LogHelper.trace("状态"+String.valueOf(change));
        }
    };

    private void refreshUIWithMessage() {
        runOnUiThread(new Runnable() {
            public void run() {
                    // refresh conversation list
                    if (conversationListFragment != null) {
                        conversationListFragment.refresh();
                    }
            }
        });
    }

至于其他地方也需要设置未读消息小红点,例如首页等,可以同样的设置监听 并调用(未读消息)

 EMClient.getInstance().chatManager().getUnreadMsgsCount();

有个问题 设置小红点的时候,必须在主线程中,不然没效果。。。

1.2 聊天界面
聊天界面就简单了

  EaseChatFragment chatFragment = new EaseChatFragment();
        //传入参数
        chatFragment.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();

清单文件中,添加

  <!-- 显示下载大图页面 -->
       <activity
           android:name="com.hyphenate.easeui.ui.EaseShowBigImageActivity"
           android:screenOrientation="portrait"
           android:theme="@style/horizontal_slide" >
       </activity>
       <!-- 下载文件 -->
       <activity
           android:name="com.hyphenate.easeui.ui.EaseShowNormalFileActivity"
           android:screenOrientation="portrait"
           android:theme="@style/horizontal_slide" >
       </activity>
       <!-- 地图 -->
       <!-- 百度地图所需的service -->
       <service
           android:name="com.baidu.location.f"
           android:enabled="true"
           android:process=":remote" />

       <activity
           android:name="com.hyphenate.easeui.ui.EaseBaiduMapActivity"
           android:screenOrientation="portrait"
           android:theme="@style/horizontal_slide" >
       </activity>

       <meta-data
           android:name="com.baidu.lbsapi.API_KEY"
           android:value="EnlZGKw8rZnNhF31HvrPpFGzeVjnhDZg" />

点击图放大,以及百度地图 发送定位,其中百度地图 得自己去开放平台去注册 并获取他的key

2.离线消息(推送)

环信对android 平台给了三个推送,GCM推送,华为推送,小米推送,GCM由于墙的原因,直接pass,小米和华为,这里以小米为例

先去小米官网注册创建应用并获取到APPID APPKEY, APPSecret,并在环信后台上传证书

image.png

清单文件配置:

 <!-- mi push -->
        <service
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
            android:enabled="true"
            android:exported="true"
            tools:ignore="ExportedService" />
        <service
            android:name="com.xiaomi.mipush.sdk.MessageHandleService"
            android:enabled="true" />

        <receiver
            android:name="com.hyphenate.chat.EMMipushReceiver"
            android:exported="true"
            tools:ignore="ExportedReceiver">
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>
        <!-- mi push end -->

java代码部分
Application 的 onCreate中

 @Override
    public void onCreate() {
        easeUI = EaseUI.getInstance();
        EMOptions options = new EMOptions();
        options.setAutoLogin(false);
        options.setMipushConfig("2882303761517595100","5261759563100");
        easeUI.init(this, options);
        registerMessageListener();
}
//全局监听,后台应用或者被杀死,从这里接收
 protected void registerMessageListener() {
        EMMessageListener messageListener = new EMMessageListener() {
            private BroadcastReceiver broadCastReceiver = null;

            @Override
            public void onMessageReceived(List<EMMessage> messages) {
                for (EMMessage message : messages) {
                    if(!easeUI.hasForegroundActivies()){
                       //如果应用不在前台(或以杀死,因为小米推送的缘故杀不死),就把消息发送到通知栏上
                        easeUI.getNotifier().onNewMsg(message);
                    }
                }
            }

            @Override
            public void onCmdMessageReceived(List<EMMessage> messages) {
                for (EMMessage message : messages) {

                }
            }

            @Override
            public void onMessageRead(List<EMMessage> messages) {
            }

            @Override
            public void onMessageDelivered(List<EMMessage> message) {
            }

            @Override
            public void onMessageChanged(EMMessage message, Object change) {

            }
        };
        EMClient.getInstance().chatManager().addMessageListener(messageListener);
    }

如果想处理点击通知栏消息的逻辑,如下

 easeUI.getNotifier().setNotificationInfoProvider(new EaseNotifier.EaseNotificationInfoProvider() {
            @Override
            public String getDisplayedText(EMMessage message) {
                return null;
            }

            @Override
            public String getLatestText(EMMessage message, int fromUsersNum, int messageNum) {
                return null;
            }

            @Override
            public String getTitle(EMMessage message) {
                return null;
            }

            @Override
            public int getSmallIcon(EMMessage message) {
                return 0;
            }

            @Override
            public Intent getLaunchIntent(EMMessage message) {
                return null;
            }
        });

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容