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

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

EaseUI3.0作为Moduel导入,

 

 

一些不要的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,并在环信后台上传证书

 

 

清单文件配置:

 <!-- 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;
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值