redpacketlibrary,在融云sdk2.5.2的基础上提供了收发红包和零钱页的功能。
2. redpacketlibrary目录说明
libs :redpacket2.0.jar是集成红包功能所依赖的jar包。
res :包含了红包SDK和聊天页面中的资源文件。(红包SDK相关以rp开头)
callback :此接口只有群/讨论组红包用到
1、GetGroupInfoCallback 获取群/讨论组里面的人数(app开发者需要自己处理)的接口回调。
2、ToRedPacketActivity 打开发红包界面接口回调
message :
1、RongRedPacketMessage 自定义红包消息。
2、RongNotificationMessage 自定义通知消息,用于领取了红包之后,回执消息发给红包者
3、RongEmptyMessage 自定义空消息,用于群/讨论组领取了红包之后,1、接受者先向本地插入一条“你领取了XX的红包”,然后发送一条空消息(不在聊天界面展示),发送红包者收到消息之后,向本地插入一条“XX领取了你的红包”,2、如果接受者和发送者是一个人就直接向本地插入一条“你领取了自己的红包”
provider :
1、RongRedPacketProvider 扩展栏单聊红包提供者
2、RongRedPacketMessageProvider 红包消息UI展示提供者
3、RongNotificationMessageProvider 回执消息UI展示提供者
4、RongGroupRedPacketProvider 扩展栏群聊/讨论组红包提供者
RPContext.java 封装了融云消息类型和模板注册以及插入消息的方法。
注意: redpacketlibrary依赖了IMKIT,可以查看redpacketlibrary的build.gradle。
LoginActivity登录时初始化用户信息。
import com.easemob.redpacketui.RPContext; /** * 以下是demo 的逻辑,与sdk 没有关系。 * 1,登录成功,获得 cookie 和 token * * @param obj */ private void loginApiSuccess(Object obj) { if (obj instanceof User) { final User user = (User) obj; if (user.getCode() == 200) { if (DemoContext.getInstance() != null && user.getResult() != null) { //获得token,通过token 去做 connect 操作 httpGetTokenSuccess(user.getResult().getToken()); SharedPreferences.Editor edit = DemoContext.getInstance().getSharedPreferences().edit(); edit.putString(Constants.APP_USER_NAME, user.getResult().getUsername()); edit.putString(Constants.APP_USER_PORTRAIT, user.getResult().getPortrait()); edit.putString(Constants.APP_TOKEN, user.getResult().getToken()); edit.putString(INTENT_PASSWORD, mPassWordEt.getText().toString()); edit.putString(INTENT_IMAIL, mUserNameEt.getText().toString()); edit.putBoolean("DEMO_ISFIRST", false); edit.apply(); //初始化红包用户信息 RPContext.getInstance().initUserInfo(user.getResult().getId(), user.getResult().getUsername(), user.getResult().getPortrait()); Log.i(TAG, "----login success---"); } } else if (user.getCode() == 103) { if (mDialog != null) mDialog.dismiss(); WinToast.toast(LoginActivity.this, R.string.app_pass_error); } else if (user.getCode() == 104) { if (mDialog != null) mDialog.dismiss(); WinToast.toast(LoginActivity.this, R.string.app_user_error); } else if (user.getCode() == 111) { if (mDialog != null) mDialog.dismiss(); WinToast.toast(LoginActivity.this, R.string.app_user_cookie); } } }
LoginActivity快速登录时初始化用户信息。
import com.easemob.redpacketui.RPContext; protected void initData() { ... if (!token.equals(Constants.DEFAULT) && !cookie.equals(Constants.DEFAULT)) { if (mDialog != null && !mDialog.isShowing()) { mDialog.show(); } //初始化红包用户信息 String userID = PreferenceManager.getDefaultSharedPreferences(this).getString( Constants.APP_USER_ID, "default"); String userName = PreferenceManager.getDefaultSharedPreferences(this).getString( Constants.APP_USER_NAME,"default"); String userAvatar = PreferenceManager.getDefaultSharedPreferences(this).getString( Constants.APP_USER_PORTRAIT, "none"); RPContext.getInstance().initUserInfo(userID, userName, userAvatar); httpGetTokenSuccess(token); } }
3.5 RongCloudEvent中、在扩展栏中增加红包按钮
需要导入的包
import com.easemob.redpacketui.provider.RongGroupRedPacketProvider; import com.easemob.redpacketui.provider.RongRedPacketProvider;
添加单聊红包入口
InputProvider.ExtendProvider[] privateProvider = { new ImageInputProvider(RongContext.getInstance()),//图片 new CameraInputProvider(RongContext.getInstance()),//相机 new RealTimeLocationInputProvider(RongContext.getInstance()),//地理位置 new VoIPInputProvider(RongContext.getInstance()),// 语音通话 new RongRedPacketProvider(RongContext.getInstance())//单聊红包 }; RongIM.resetInputExtensionProvider(Conversation.ConversationType.PRIVATE, privateProvider);
添加群聊红包入口
InputProvider.ExtendProvider[] groupProvider = { new ImageInputProvider(RongContext.getInstance()),//图片 new CameraInputProvider(RongContext.getInstance()),//相机 new RealTimeLocationInputProvider(RongContext.getInstance()),//地理位置 new ContactsProvider(RongContext.getInstance()),//通讯录 new RongGroupRedPacketProvider(RongContext.getInstance(), new GetGroupInfoCallback() { //获取群组信息,并回调把群里面人数给回调接口 @Override public void getGroupPersonNumber(final String groupID, final ToRedPacketActivity mCallback) { if (DemoContext.getInstance().getGroupNumberById(groupID) != null) { //这里的缓存群组信息的逻辑仅供参考 int number = Integer.parseInt(DemoContext.getInstance().getGroupNumberById(groupID)); mCallback.toRedPacketActivity(number); } else { DemoContext.getInstance().getDemoApi().getGroupByGroupId(groupID, new ApiCallback<GroupInfo>() { @Override public void onComplete(AbstractHttpRequest<GroupInfo> abstractHttpRequest, GroupInfo groupInfo){ if (groupInfo.getCode() == 200 && groupInfo.getResult() != null) { Log.e(TAG, groupInfo.getResult().getNumber()); int number = Integer.parseInt(groupInfo.getResult().getNumber()); //缓存群人数 if (DemoContext.getInstance() != null) DemoContext.getInstance().putGroupNmber(groupID, String.valueOf(number)); //打开发红包界面 mCallback.toRedPacketActivity(number); } else { WinToast.toast(mContext, String.valueOf(groupInfo.getCode())); } } @Override public void onFailure(AbstractHttpRequest abstractHttpRequest, BaseException e) { Log.e(TAG, e.toString()); } }); } } })//群红包 }; RongIM.resetInputExtensionProvider(Conversation.ConversationType.GROUP, groupProvider);
添加讨论组红包入口
InputProvider.ExtendProvider[] discussionProvider = {//讨论组 new ImageInputProvider(RongContext.getInstance()),//图片 new CameraInputProvider(RongContext.getInstance()),//相机 new RealTimeLocationInputProvider(RongContext.getInstance()),//地理位置 new ContactsProvider(RongContext.getInstance()),//通讯录 new RongGroupRedPacketProvider(RongContext.getInstance(), new GetGroupInfoCallback() { //获取群组信息,并回调把群里面人数给回调接口 @Override public void getGroupPersonNumber(final String groupID, final ToRedPacketActivity mCallback) { RongIM.getInstance().getRongIMClient().getDiscussion(groupID, new RongIMClient.ResultCallback<Discussion>() { @Override public void onSuccess(Discussion discussion) { //打开发红包界面 mCallback.toRedPacketActivity(discussion.getMemberIdList().size()); } @Override public void onError(RongIMClient.ErrorCode errorCode) { } }); } })//讨论组红包 }; RongIM.resetInputExtensionProvider(Conversation.ConversationType.DISCUSSION, discussionProvider);