消息总数 环信android
2016-08-16 16:49:35 wuqilianga 阅读数 9190


参考环信官方文档 : http://docs.easemob.com/start/200androidcleintintegration/100customizedextension


官方参考社区文档 : http://www.imgeek.org/search/q-6Ieq5a6a5LmJ5omp5bGV5raI5oGv#all


参考个人社区 名片集成 : http://www.imgeek.org/article/825307924


个人使用的是环信2.0 以下名片集成是环信 3.0 不过对应参考着设计是没问题的


2.0情况下:

1. 主要是修改ChatActivity.java相关联的listview的MessageAdapter.java中的以下方法:

getItem(int)
getItemId(int)
getViewTypeCount()
getItemViewType(int)
getView(int, View, ViewGroup)


2.修改好了聊天页面后,再来修改聊天历史列表页面ChatAllHistoryFragment.java下的ChatAllHistoryAdapter


修改完这两步基本就可以实现了自定义扩展功能了,而环信官方给出的demo中,语音通话、视频通话就是通过自定义Type.TXT方式实现的。具体可以参考这两个功能怎么实现发送展示item。


下面给出环信参考3.0的修改方法(转载自文章开头社区    名片集成  案例   -----   个人社区 名片集成 : http://www.imgeek.org/article/825307924):


android扩展消息(名片集成)

很多社交软件都少不了名片这种东西,可是,用环信怎么去解决这个名片问题呢。

首先呢,大家要注意环信IOS版的扩展消息ext不能接收json格式数据。。。(之前不知道,ios把我坑了一次)

接下来,我就给大家来集成下名片消息

要想在ios端显示出来,那么必须两个客户端的扩展字段必须相同,这个大家一定要知道

1.png

我的扩展字段是这样的,上面也解释的很清楚,大家不要看错,是名片上的,不是自己的id,昵称

接下来我们要去定义几个常量在chatFragment里面
2.png

定义好之后,那么接下来我们需要到chatFragment里面去注册这个按钮
3.png

对,没错,就是这么简单,注册一个按钮,然后,我们需要到onExtendMenuItemClick这个方法中写名片按钮的点击事件

4.png

大家看到了是个startActivityForResult,看到这里,肯定接下来就是去到REQUEST_CODE_SELEST_MINGPIAN里面接收data

5.png


REQUEST_CODE_SELEST_MINGPIAN是写在if(resultCode == Activity.RESULT_OK) {}里面的

接下来我们需要去CustomChatRowProvider这个内部类里面去设置发送接收,大家需要注意getCustomChatRowTypeCount(){}方法里面必须要加上2,这个2的意思就是说发送和接收名片

6.png

这里大家应该可以看到,我只写了发送名片,没有写接收名片,原因就是我不需要自己点自己发送出去的名片,所以没写,这个如果要的话,照葫芦画瓢,SoEasy

接下来这个非常重要,这个是名片消息的ChatRow,就是载体

7.png

 
对,就是new一个chatRow出来,这个chatRow在easeui里面是没有的,所以需要我们自己写

8.png

必须注意,一定要继承EaseChatRow,不然就调不出onInflatView,onFindViewById,onUpdateView,onSetUpView,onBubbleClick这几个方法

9.png

这个方法名已经很明显了onFindViewById,也就是说,在这里绑定布局里面的id,最重要的方法是onSetUpView

10.png

这里设置完了之后,基本上就好了,布局我没有放出来,等会看运行之后的效果

这几个方法的意思大家去看EaseUI里面的EaseChatRow

到最后,我们还需要一个步骤,就是去DemoHelper里面监听消息是不是名片扩展消息

11.png

是不是很好理解,这个完了之后,运行。。。。

12.png

完美!!!

如果大家还有什么问题,那么就加入环信IM互帮互助群 340452063认准杭州-android-中草,龙瞎头像,找我,帮你解答一切扩展消息问题

2017-06-21 13:11:07 wangwasdf 阅读数 5407

之前集成即时通讯(环信)的时候,需要用到自定义消息的功能。而在开发过程中遇到了许多的问题,之前工作比较忙,现在有时间了记录一下。

第一步:

首先,在聊天界面添加一个发送扩展消息的MenuItem:

ChatFragment类中定义一个常量,用来ItemId。

private static final int RECORDS = 20;

registerExtendMenuIte()方法中注册MenuItem:

inputMenu.registerExtendMenuItem("名片", R.drawable.ease_blue_add, RECORDS, extendMenuItemClickListener);

在onExtendMenuItemClick()方法中设置点击事件,发送消息:


注意:一定要设置聊天的类型,默认是单聊,如果不设置,那么在群组或者是聊天室等多人聊天时,对方是无法接收到正确消息的。

//设置消息类型,默认是单聊,如果不设置,在群聊中就收不到消息
if (chatType == EaseConstant.CHATTYPE_GROUP) {
    message.setChatType(EMMessage.ChatType.GroupChat);
} else if (chatType == EaseConstant.CHATTYPE_CHATROOM) {
    message.setChatType(EMMessage.ChatType.ChatRoom);
}

第二步:

在easeui库中找的EaseMessageAdapter类(这个是消息适配器)。

定义两个常量,用于表示消息类型(注意:扩展一种消息类型,需要定义两个常量:接收+发送):

private static final int MESSAGE_TYPE_SENT_RECORDS = 14;
private static final int MESSAGE_TYPE_RECV_RECORDS = 15;

getViewTypeCount()修改返回的消息类型:+2(每扩展一种消息类型,返回的数值+2)


在getItemViewType()方法中设置返回的消息类型,并+2:



在createChatRow()方法中设置消息的类:


其中EaseChatRowRecords类,是自己定义的消息类型,继承EaseChatRow类:


到此已经完成了扩展消息的开发。

2017-11-19 18:36:46 z19980115 阅读数 2552

先上图。

实现方式很简单,设置为免打扰的群,去掉消息提醒(环信接收消息的回调中处理),然后消息数用浅蓝色圆点并且在不包含在左下角的消息总数中。



下面贴代码:


1、EaseSharedUtils

放在easeui库的utils包下

用于设置免打扰,消息列表的adapter中也根据这个来判断用红点还是蓝点,这部分代码就不贴了自己处理。

public class EaseSharedUtils {

    private static SharedPreferences sha;

    public static SharedPreferences getCacheShared(Context context) {
        if (sha == null) {
            sha = context.getSharedPreferences("cache", 0);
        }
        return sha;
    }

    /**
     * 群组收到消息是否允许响铃
     * false为不允许响铃,即开启了免打扰
     * uid:当前环信用户账号
     * groupId:目标群组id 
     */
    public static boolean isEnableMsgRing(Context context, String uid, String groupId) {

        return getCacheShared(context).getBoolean(uid + "_" + groupId, true);

    }

    /**
     * 设置是否允许响铃,true允许
     */
    public static void setEnableMsgRing(Context context, String uid, String groupId, boolean enable) {

        SharedPreferences.Editor editor = getCacheShared(context).edit();
        editor.putBoolean(uid + "_" + groupId, enable);
        editor.apply();
    }

}


2、修改easeuiutils/EaseCommonUtils中的isSilentMessage()

修改此方法后设置为免打扰的群组就不会响铃或震动。

修改如下:

/**
     * \~chinese
     * 判断是否是免打扰的消息,如果是app中应该不要给用户提示新消息
     * \~english
     * check if the message is kind of slient message, if that's it, app should not play tone or vibrate
     */
    public static boolean isSilentMessage(Context context, EMMessage message) {
        return message.getChatType() == EMMessage.ChatType.GroupChat &&
                !EaseSharedUtils.isEnableMsgRing(context, EMClient.getInstance().getCurrentUser(), message.getTo());

    }



3、修改左下角消息总数(不计算免打扰消息数)

环信有提供获取消息总数的方法

EMClient.getInstance().chatManager().getUnreadMessageCount();

但这个方法得到的是所有未读消息数,而我们想要的是不包括免打扰的。


我们点击getUnreadMessageCount()进去看环信怎么实现的

环信实现如下

public int getUnreadMessageCount() {
        List var1 = this.emaObject.getConversations();
        int var2 = 0;
        Iterator var3 = var1.iterator();

        while(var3.hasNext()) {
            EMAConversation var4 = (EMAConversation)var3.next();
            if(var4._getType() != EMAConversationType.CHATROOM) {
                var2 += var4.unreadMessagesCount();
            }
        }

        return var2;
    }

可以看到环信是通过emaObject获取到所有会话,循环计算每个会话的未读消息数。




这样就有办法修改了,用emaObject对象,拿到所有会话,循环判断是不是免打扰的会话,自己计算总数量。


问题又来了,EMAChatManager emaObject;是default类型,不能直接获取到对象

怎么办,反射呗

获取未读总数代码如下,项目用kotlin写的,用Java的同学自己翻译吧:)

private fun getUnreadMessageCount(): Int {
        val emaObject = DataTool.getSpecifiedFieldObject(EMClient.getInstance().chatManager(),
                "emaObject") as EMAChatManager
        val var1 = emaObject.conversations
        var unRead = 0
        val var3 = var1.iterator()

        while (var3.hasNext()) {
            val conversation = var3.next() as EMAConversation
            if (conversation._getType() != EMAConversation.EMAConversationType.CHATROOM &&
                    EaseSharedUtils.isEnableMsgRing(this,  EMClient.getInstance().getCurrentUser(),conversation.conversationId())) {
                unRead += conversation.unreadMessagesCount()
            }
        }
        return unRead
    }



DataTool.getSpecifiedFieldObject()

/**
     * 反射获取指定字段对象
     */
    public static Object getSpecifiedFieldObject(Object obj, String fieldName) {
        Class<?> clazz = obj.getClass();
        Object object = null;
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            object = field.get(obj);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return object;

    }


4、。。。。



没了~~~


2017-07-12 09:34:44 m0_37361593 阅读数 7392

使用拓展消息实现聊天界面和消息列表的头像和昵称的展示

上篇文章只是简单的介绍怎么集成环信,但是在自己的项目中涉及到聊天这一块。在做android开发的时候,往往要考虑到怎么展示用户昵称和头像的问题。说明一点:我们这个项目的用户头像和昵称是我们后台返回给我们的。我们只需要给用户设置拓展属性。

一、首先集成环信:

app如何引入一个module作为依赖:

  1. 在自己的该app工作空间下,导入easeui这个module

  2. 在项目菜单的project structure中,app---dependencies--添加module依赖。

  3. clean工程—rebuild工程。


首先要解决架包冲突问题。(v7冲突。)

解决方案:1.app下的架包放到easeUIgradle中。

2.实在不行,就查看所有gradle下面时候有重复的架包及依赖。


二、集成环信的聊天界面:

由于要使用到拓展消息,所以我们首先在工具类中定义一下我们自己和好友的属性。from表示我,to表示好友。

        public static final String FROM_AVATER="from_avater";
	public static final String FROM_NICHENG="from_nicheng";
	public static final String TO_AVATER="to_avater";
	public static final String TO_NICHENG="to_nicheng";

在easeui的widget包下的chatrow包的EaseChatRow这个类中,在消息的发送和接收处将其更改为拓展属性:

/**
 * 聊天界面
 * 聊天界面需要获取用户的头像和昵称
 * 方法:采用扩展属性的方法。
 * 定义 自己和他人的属性:from_avater from_nicheng自己的头像和昵称   
 * to_avater  to_nicheng 对方的头像和昵称
 * 自身头像昵称在进入应用的时候存到文件中,待聊天界面直接从文件中取出来。
 * 对方头像从消息列表中获取
 */
//环信中的聊天页面
//set nickname and avatar
        /**
         * 聊天页面
         */
        if (message.direct() == Direct.SEND) {
            //  EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView);
            try {
                Glide.with(getContext()).load(message.getStringAttribute("from_avater")).into(userAvatarView);
             //   usernickView.setText(message.getStringAttribute("from_nicheng"));
                EaseUserUtils.setUserNick(message.getStringAttribute("from_nicheng"), usernickView);
                
            } catch (HyphenateException e) {

            }
        }
        //   
        else {
            //  EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView);
            //  EaseUserUtils.setUserNick(message.getFrom(), usernickView);
            try {
              //  usernickView.setText(message.getStringAttribute("from_nicheng"));
               EaseUserUtils.setUserNick(message.getStringAttribute("from_nicheng"), usernickView);
                Glide.with(getContext()).load(message.getStringAttribute("from_avater")).into(userAvatarView);
            } catch (HyphenateException e) {

            }
        }

在自己的app下定义聊天界面ChatActivity如下:

public class ChatActivity extends BaseActivity {
    private String logo;
    private static String name;
    private String logoPath;
    private String tradeName;
    public static ChatActivity activityInstance;
    private Bundle extras;

    //给扩展属性设置头像和昵称。
    EaseChatFragment.EaseChatFragmentHelper helper = new EaseChatFragment.EaseChatFragmentHelper() {
        @Override
        public void onSetMessageAttributes(EMMessage message) {
            // 附带扩展属性,头像和昵称他人的
            message.setAttribute(Utils.TO_AVATER, logo);
            message.setAttribute(Utils.TO_NICHENG, name);
          
            //我的头像  存到自己的文件中
            message.setAttribute(Utils.FROM_AVATER, logoPath);
            message.setAttribute(Utils.FROM_NICHENG, tradeName);
        }
        @Override
        public void onEnterToChatDetails() {
        }
        @Override
        public void onAvatarClick(String username) {
        }
        @Override
        public void onAvatarLongClick(String username) {
        }
        @Override
        public boolean onMessageBubbleClick(EMMessage message) {
            return false;
        }
        @Override
        public void onMessageBubbleLongClick(EMMessage message) {
        }
        @Override
        public boolean onExtendMenuItemClick(int itemId, View view) {
            return false;
        }
        @Override
        public EaseCustomChatRowProvider onSetCustomChatRowProvider() {
            return null;
        }
    };
    
    @Override
    protected void init() {
        super.init();
        //在布局中设置一个容器。集成环信的聊天界面添加进去
        setContentView(R.layout.activity_chat);
        initView();
    }
    private void initView() {
        //从消息列表获取头像和昵称
        logo = getIntent().getStringExtra(Utils.FROM_AVATER);
        name = getIntent().getStringExtra(Utils.FROM_NICHENG);
        //并从本地取出我的头像
        logoPath = SpUtils.getLogoPath(this);
        tradeName = SpUtils.getTradeName(this);
        //将环信的聊天界面chatFragment集成进来
        initHx();
    }
    public void initHx() {
        activityInstance = this;
        ChatFragment chatf = new ChatFragment();
        //获取从上个界面获取的参数,传给聊天界面。
        extras = getIntent().getExtras();
        chatf.setArguments(extras);
        //这个监听是接收到消息就给消息设置拓展属性。
        chatf.setChatFragmentListener(helper);
        getSupportFragmentManager().beginTransaction().add(R.id.container, chatf).commit();

    }

    /**
     * 继承环信的聊天页面  
     * 实现消息监听和聊天页面的标题上显示的对方昵称
     * 
     *
     */
    public static class ChatFragment extends EaseChatFragment implements EMMessageListener {
        /**
         * 设置聊天页面的title上面的昵称
         */
        @Override
        protected void setUpView() {
            super.setUpView();
            titleBar.setTitle(name);
            
        }

    }

}

当我们点击好友列表时(我的好友列表的数据是从服务器获取的。能够获取到好友的头像和昵称。自己的头像和昵称已进入自己的应用就保存到自己的文件中):

//则点击进入聊天界面,和环信id

//从服务器获取到昵称头像
                    String chatId = data.getChatId();
                    String name = data.getName();
                    String headerURL = data.getHeaderURL();


                    Log.i("shi",chatId+"#"+name+"#"+headerURL);
                    Intent intent = new Intent(this, ChatActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString(EaseConstant.EXTRA_USER_ID, chatId);  //传递用户id
                    bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE); //传递是群聊还是单聊
                    intent.putExtras(bundle);
                    intent.putExtra(Utils.FROM_NICHENG, name);
                    intent.putExtra(Utils.FROM_AVATER, headerURL);
                    startActivity(intent);

三、集成环信的消息列表:

在easeui中找到EaseConversationAdapter这个类。当接收到最后一条消息的时候将其设置为对应的拓展属性。(这样在展示消息列表时会展示好友的头像昵称)

 else if(conversation.getType() == EMConversationType.ChatRoom){
            holder.avatar.setImageResource(R.drawable.ease_group_icon);
            EMChatRoom room = EMClient.getInstance().chatroomManager().getChatRoom(username);
            holder.name.setText(room != null && !TextUtils.isEmpty(room.getName()) ? room.getName() : username);
            holder.motioned.setVisibility(View.GONE);
        }else {/**
         * 获取列表最后一条消息是接收还是发送
         * 然后设置昵称和头像
         */
            EMMessage lastMessage = conversation.getLastMessage();
            if (lastMessage.direct() == EMMessage.Direct.RECEIVE) {
                try {
                    Glide.with(getContext()).load(lastMessage.getStringAttribute("from_avater")).into(holder.avatar);
                    EaseUserUtils.setUserNick(lastMessage.getStringAttribute("from_nicheng"), holder.name);
                } catch (HyphenateException e) {
                }
            } else {
                try {
                    EaseUserUtils.setUserNick(lastMessage.getStringAttribute("to_nicheng"), holder.name);
                    Glide.with(getContext()).load(lastMessage.getStringAttribute("to_avater")).into(holder.avatar);
                } catch (HyphenateException e) {
                }
            }
        }
        {
            // EaseUserUtils.setUserAvatar(getContext(), username, holder.avatar);
            // EaseUserUtils.setUserNick(username, holder.name);
            holder.motioned.setVisibility(View.GONE);
        }

在app项目中集成环信的消息列表:

1.	写一个布局文件,布局文件中设置一个容器,用来接收 环信的消息列表。
EaseConversationListFragment  cf = new EaseConversationListFragment();
getActivity().getSupportFragmentManager().beginTransaction().add(R.id.fl_contains,cf).commit();
2.	给消息列表设置一个消息到来的监听。
MClient.getInstance().chatManager().addMessageListener(emMessageListener);
private EMMessageListener emMessageListener = new EMMessageListener() {
        @Override
        public void onMessageReceived(List<EMMessage> list) {
            //在环信包下的消息列表中对消息对象进行了筛选。将第0个消息存为32个8账号的消息,
            // 从消息列表中取出第0个消息对象。(第0个消息就是存有32个8该账号的消息对象)
            EMMessage emMessage = list.get(0);
            String s = emMessage.getBody().toString();
            try {
                //这里是订单消息
                EMConversation conversation = EMClient.getInstance().chatManager().getConversation("88888888888888888888888888888888");
                //未读的消息数量普通消息
                unreadMsgCount = conversation.getUnreadMsgCount();
                Log.i("123---", s + "---from:" + emMessage.getFrom() + "---to:" + emMessage.getTo() + "---nicheng:" + emMessage.getStringAttribute("from_nicheng"));
            } catch (Exception e) {
                cf.refresh();
                Log.i("123---", s + "---from:" + emMessage.getFrom() + "---to:" + emMessage.getTo());
            }
                cf.refresh();
        }
        //透传消息的
        @Override
        public void onCmdMessageReceived(List<EMMessage> list) {
            EMMessage emMessage = list.get(0);
            try{
                EMCmdMessageBody body = (EMCmdMessageBody) emMessage.getBody();
                String action = body.action();
                if (action.equals("isDisable")){//启用和禁止 退出
                   //直接退出app和环信。
                    exitLogin();
                }else if (action.equals("changePassword")){//修改密码  退出
                    exitLogin();
                }else if (action.equals("setRights")){//权限   
                    EventBus.getDefault().post("修改权限");
                    //接收到修改权限的消息。立马去重新获取权限信息
                    reGetRight();
                }else if (action.equals("reloadNickname")){//修改用户资料  刷新个人中心和首页
                    EventBus.getDefault().post("修改资料");
                    //刷新本页面
                    requestInfo();
                }
               
            }catch (Exception e){
                
            }
            
        }

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

        }

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

        }

        @Override
        public void onMessageChanged(EMMessage emMessage, Object o) {

        }
    };

给消息列表添加点击监听:

3.给消息列表设置点击事件,点击跳到聊天界面。(先从好友列表聊天才会产生消息列表)
cf.setConversationListItemClickListener(new EaseConversationListFragment.EaseConversationListItemClickListener() {
            @Override
            public void onListItemClicked(EMConversation conversation) {
                // 聊天需要的bundle对象
                Intent intent = new Intent(getActivity(), ChatActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString(EaseConstant.EXTRA_USER_ID, conversation.getLastMessage().getUserName());
                bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE);
                intent.putExtras(bundle);
                /**
                 * 从会话列表跳转到聊天页面
                 * 首先要判断最后一条信息是接收还是发送消息
                 * 然后分情况传递头像和昵称
                 *
                 */
                EMMessage lastMessage = conversation.getLastMessage();
                if (lastMessage.direct() == EMMessage.Direct.RECEIVE) {
                    try {
                        intent.putExtra(Utils.FROM_AVATER, lastMessage.getStringAttribute(Utils.FROM_AVATER));
                        intent.putExtra(Utils.FROM_NICHENG, lastMessage.getStringAttribute(Utils.FROM_NICHENG));
                    } catch (HyphenateException e) {
                        e.printStackTrace();
                    }
                } else {
                    try {
                        intent.putExtra(Utils.FROM_AVATER, lastMessage.getStringAttribute(Utils.TO_AVATER));
                        intent.putExtra(Utils.FROM_NICHENG, lastMessage.getStringAttribute(Utils.TO_NICHENG));
                    } catch (HyphenateException e) {
                        e.printStackTrace();
                    }
                }
                startActivity(intent);
            }
        });


activity销毁的时候记得移除消息的监听:

EMClient.getInstance().chatManager().removeMessageListener(emMessageListener);  

四、结束语

大致集成步骤就是这样的,集成环信之前如果对环信一点都不了解建议先去环信上看一下文档。文章纯属按照自己的项目开发需求写的。大家可做参考。


 

















Android环信通讯

阅读数 629

没有更多推荐了,返回首页