====== 环信红包接入文档 ====== ---- 新开商户可免费发送累计5000元总额的红包,超过5000元后,红包功能自动关闭,直到商户付费购买增值服务“红包功能”后,该功能重新开启,购买增值服务请咨询环信商务经理。 ===== 环信红包简介(此文档只针对非Demo版本的集成说明,仅做参考)===== 1.redpacketlibrary,在环信SDK的基础上提供了收发红包和零钱的功能。 2.环信官方版Demo已默认集成红包功能,可以直接下载试用。 ===== redpacketlibrary目录说明 ===== * libs :包含了集成红包功能所依赖的jar包。(红包使用了glide库做图片加载,由于已经依赖了easeui这里不重复添加) * res :包含了红包SDK和聊天页面中的资源文件。(红包SDK相关以rp开头,聊天页面相关以em开头) * utils : 封装了收发红包的相关方法。 * widget :聊天界面中的红包以及领取红包后的chatrow。 * RedPacketConstant.java 红包功能需要的常量。 * 注意: 由于RedPacketUtil类中使用了环信SDK中相关方法,redpacketlibrary依赖了easeui。 ===== 集成步骤 ===== ==== 1.添加对红包工程的依赖 ==== * ChatDemo的build.gradle中 dependencies { compile project(':redpacketlibrary') compile project(':EaseUI') compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-multidex.jar') } * ChatDemo的setting.gradle中 include ':EaseUI', ':redpacketlibrary' ==== 2.ChatDemo清单文件中注册红包相关组件 ==== ==== 3.DemoApplication初始化红包上下文 ==== import com.easemob.redpacketsdk.RedPacket; @Override public void onCreate() { super.onCreate(); RedPacket.getInstance().initContext(applicationContext); //打开Log开关 正式发布时请关闭 RedPacket.getInstance().setDebugMode(true); } ==== 4.ChatFragment中增加收发红包的功能 ==== * 添加红包相关常量 private static final int MESSAGE_TYPE_RECV_RED_PACKET = 5; private static final int MESSAGE_TYPE_SEND_RED_PACKET = 6; private static final int MESSAGE_TYPE_SEND_RED_PACKET_ACK = 7; private static final int MESSAGE_TYPE_RECV_RED_PACKET_ACK = 8; private static final int ITEM_RED_PACKET = 16; private static final int REQUEST_CODE_SEND_RED_PACKET = 15; * 添加红包入口 @Override protected void registerExtendMenuItem() { //demo这里不覆盖基类已经注册的item,item点击listener沿用基类的 super.registerExtendMenuItem(); //聊天室暂时不支持红包功能 if (chatType != Constant.CHATTYPE_CHATROOM) { inputMenu.registerExtendMenuItem(R.string.attach_red_packet, R.drawable.em_chat_red_packet_selector, ITEM_RED_PACKET, extendMenuItemClickListener); } } * 添加自定义chatrow到CustomChatRowProvider,详见ChatFragment中的CustomChatRowProvider。 * ContextMenuActivity的onCreate()中屏蔽红包消息的转发和撤回功能。 if (type == EMMessage.Type.TXT.ordinal()) { if(message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, false) || message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false) || message.getBooleanAttribute(RedPacketConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)){ setContentView(R.layout.em_context_menu_for_location); } } if (message.direct == EMMessage.Direct.RECEIVE || message.getChatType() == EMMessage.ChatType.ChatRoom //red packet code : 屏蔽红包消息的撤回功能 || message.getBooleanAttribute(RedPacketConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)) { //end of red packet code View view = findViewById(R.id.text_revoke); if(view != null){ view.setVisibility(View.GONE); } } * 进入发红包页面 @Override public boolean onExtendMenuItemClick(int itemId, View view) { switch (itemId) { ... case ITEM_RED_PACKET: RedPacketUtils.startRedPacketActivityForResult(this, chatType, toChatUsername, REQUEST_CODE_SEND_RED_PACKET); break; default: break; } //不覆盖已有的点击事件 return false; } * 发送红包消息到聊天页面 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ... if(resultCode == Activity.RESULT_OK){ switch (requestCode) { ... case REQUEST_CODE_SEND_RED_PACKET: if (data != null){ sendMessage(RedPacketUtils.createRPMessage(getActivity(), data, toChatUsername)); } break; default: break; } } } * 领取红包并发送回执消息到聊天窗口 @Override public boolean onMessageBubbleClick(EMMessage message) { //消息框点击事件,demo这里不做覆盖,如需覆盖,return true if (message.getBooleanAttribute(RedPacketConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)){ RedPacketUtils.openRedPacket(getActivity(), chatType, message, toChatUsername, messageList); return true; } return false; } * ChatFragment中群红包领取回执的处理(聊天页面) @Override public void onEvent(EMNotifierEvent event) { switch (event.getEvent()) { case EventNewCMDMessage: EMMessage cmdMessage = (EMMessage) event.getData(); CmdMessageBody cmdMsgBody = (CmdMessageBody) cmdMessage.getBody(); final String action = cmdMsgBody.action;//获取自定义action if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)) { RedPacketUtil.receiveRedPacketAckMessage(cmdMessage); messageList.refresh(); } break; } super.onEvent(event); } * MainActivity中群红包领取回执的处理(导航页面) @Override public void onEvent(EMNotifierEvent event) { switch (event.getEvent()) { ... case EventNewCMDMessage: EMMessage cmdMessage = (EMMessage) event.getData(); //获取消息body CmdMessageBody cmdMsgBody = (CmdMessageBody) cmdMessage.getBody(); final String action = cmdMsgBody.action;//获取自定义action ... if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)) { RedPacketUtil.receiveRedPacketAckMessage(cmdMessage); } refreshUIWithMessage(); break; default: break; } } ==== 5.群红包领取回执的全局处理 ==== * DemoHelper中 protected void registerEventListener() { eventListener = new EMEventListener() { private BroadcastReceiver broadCastReceiver = null; @Override public void onEvent(EMNotifierEvent event) { switch (event.getEvent()) { ... case EventNewCMDMessage: //获取消息body CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody(); final String action = cmdMsgBody.action;//获取自定义action if(!easeUI.hasForegroundActivies()){ if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ RedPacketUtil.receiveRedPacketAckMessage(message); broadcastManager.sendBroadcast(new Intent(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)); } } break; ... } } }; EMChatManager.getInstance().registerEventListener(eventListener); } * MainActivity中 private void registerBroadcastReceiver() { broadcastManager = LocalBroadcastManager.getInstance(this); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Constant.ACTION_CONTACT_CHANAGED); intentFilter.addAction(Constant.ACTION_GROUP_CHANAGED); intentFilter.addAction(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION); broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ... if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ if (conversationListFragment != null){ conversationListFragment.refresh(); } } } }; broadcastManager.registerReceiver(broadcastReceiver, intentFilter); } ==== 6.ConversationListFragment中对红包回执消息的处理 ==== @Override protected void setUpView() { ... conversationListView.setConversationListHelper(new EaseConversationListHelper() { @Override public String onSetItemSecondaryText(EMMessage lastMessage) { if (lastMessage.getBooleanAttribute(RedPacketConstant.MESSAGE_ATTR_IS_RED_PACKET_ACK_MESSAGE, false)) { String sendNick = lastMessage.getStringAttribute(RedPacketConstant.EXTRA_RED_PACKET_SENDER_NAME, ""); String receiveNick = lastMessage.getStringAttribute(RedPacketConstant.EXTRA_RED_PACKET_RECEIVER_NAME, ""); String msg; if (lastMessage.direct == EMMessage.Direct.RECEIVE) { msg = String.format(getResources().getString(R.string.money_msg_someone_take_money), receiveNick); } else { if (sendNick.equals(receiveNick)) { msg = getResources().getString(R.string.money_msg_take_money); } else { msg = String.format(getResources().getString(R.string.money_msg_take_someone_money), sendNick); } } return msg; } return null; } }); super.setUpView(); } ==== 7.添加零钱页的入口 ==== RedPacketUtils.startChangeActivity(getActivity()); ---- 上一页:[[start:200androidcleintintegration:90realtimeaudio|实时通话]] 下一页:[[start:200androidcleintintegration:20iosnickname|设置当前登录用户的 iOS 推送昵称]]