差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
im:android:basics:redpacket [2018/09/14 10:10]
haozki
— (当前版本)
行 1: 行 1:
-====== 环信红包接入文档 ====== 
- 
----- 
- 
-新开商户可免费发送累计5000元总额的红包,超过5000元后,红包功能自动关闭,直到商户付费购买增值服务“红包功能”后,该功能重新开启,购买增值服务请咨询环信商务经理。 
- 
-== 集成概述 == 
- 
-  *    红包SDK分为两个版本,即钱包版红包SDK与支付宝版红包SDK。 
-  *    使用钱包版红包SDK的用户,可以使用银行卡支付或支付宝支付等第三方支付来发红包;收到的红包金额会进入到钱包余额,并支持提现到绑定的银行卡。 
-  *    使用支付宝版红包SDK的用户,发红包仅支持支付宝支付;收到的红包金额即时入账至绑定的支付宝账号。 
-  *    请选择希望接入的版本并下载对应的SDK进行集成,钱包版红包SDK与支付宝版红包SDK集成方式相同。 
-  *    需要注意的是如果已经集成了钱包版红包SDK,暂不支持切换到支付宝版红包SDK(两个版本不支持互通)。 
-  *    环信Demo中使用redPacketlibrary模块集成了红包SDK相关红能。 
-  *    [https://​github.com/​easemob/​sdkdemoapp3.0_android/​tree/​sdk3.0 集成Demo] 
- 
-== redPacketlibrary介绍 == 
- 
-  * redPacketlibrary是在环信Demo中集成红包功能的模块,开发者可参考该模块中的方法集成红包功能。建议开发者以模块的形式集成红包功能,便于项目的更新和维护。 
-=====   ​redpacketlibrary目录说明 =====  
- 
-  * libs :包含了集成红包功能所依赖的jar包。(红包使用了glide库做图片加载,由于已经依赖了easeui这里不重复添加) 
-  * res :包含了聊天页面中的资源文件(例如红包消息卡片,回执消息的UI等)。 
-  * utils包 : 封装了收、发红包的相关方法。 
-  * widget包:聊天界面中的红包消息、红包回执消息的ChatRow。(开发者可自定义红包消息及回执消息的UI) 
-  
-注意: RedPacketUtil类中使用了环信SDK中相关方法,以及红包chatrow继承自EaseChatRow,redpacketlibrary依赖了easeui,如不使用上诉相关代码可不依赖easeui。 
-  
-=====  集成步骤 =====  
-* 以支付宝版红包SDK为例,修改com.hyphenate.redpacket:​redpacket-alipay:​1.1.2中的1.1.2为已发布的更高版本(例如1.1.3),同步之后即可完成红包SDK的更新。 
- 
-==== 1.添加对红包工程的依赖 ==== 
- 
- 
-  * ChatDemo的build.gradle中 
- 
-<code java> 
- 
-    //​添加远程仓库地址 
-    allprojects { 
-        repositories { 
-            jcenter() 
-            maven {  url "​https://​raw.githubusercontent.com/​HyphenateInc/​Hyphenate-SDK-Android/​master/​repository"​ } 
-        } 
-    } 
- 
-     ​dependencies { 
-        compile project(':​redpacketlibrary'​) 
-        compile project(':​EaseUI'​) 
-        compile fileTree(dir:​ '​libs',​ include: '​*.jar',​ exclude: '​android-support-multidex.jar'​) 
-     } 
-  
-</​code>​ 
-  
-  * ChatDemo的setting.gradle中 
-  
-<code java> 
- 
-      include ':​EaseUI',​ ':​redpacketlibrary'​ 
- 
-</​code>​ 
- 
-==== 2.ChatDemo清单文件中注册红包相关组件 ==== 
- 
-<code java> 
- 
-    <​uses-sdk 
-            android:​minSdkVersion="​9"​ 
-            android:​targetSdkVersion="​19"​ 
-            tools:​overrideLibrary="​com.easemob.redpacketui"​ 
-        /> 
-        ​ 
-    <​!--支付宝版 start--> 
- 
-<​!--发红包页面-->​ 
-<​activity 
-   ​android:​name="​com.easemob.redpacketui.ui.activity.RPRedPacketActivity"​ 
-   ​android:​screenOrientation="​portrait"​ 
-   ​android:​windowSoftInputMode="​adjustPan|stateVisible"/>​ 
-<​!--红包详情页面-->​ 
-<​activity 
-   ​android:​name="​com.easemob.redpacketui.ui.activity.RPDetailActivity"​ 
-   ​android:​screenOrientation="​portrait"​ 
-   ​android:​windowSoftInputMode="​adjustPan"/>​ 
-<​!--红包记录页面-->​ 
-<​activity 
-   ​android:​name="​com.easemob.redpacketui.ui.activity.RPRecordActivity"​ 
-   ​android:​screenOrientation="​portrait"​ 
-   ​android:​windowSoftInputMode="​adjustPan"/>​ 
-<​!--群成员列表页面-->​ 
-<​activity 
-   ​android:​name="​com.easemob.redpacketui.ui.activity.RPGroupMemberActivity"​ 
-   ​android:​screenOrientation="​portrait"​ 
-   ​android:​windowSoftInputMode="​adjustPan|stateHidden"/>​ 
-<​!--支付宝H5支付页面-->​ 
-<​activity 
-   ​android:​name="​com.alipay.sdk.app.H5PayActivity"​ 
-   ​android:​configChanges="​orientation|keyboardHidden|navigation|screenSize"​ 
-   ​android:​exported="​false"​ 
-   ​android:​screenOrientation="​behind"​ 
-   ​android:​windowSoftInputMode="​adjustResize|stateHidden"​ /> 
-<​!--支付宝H5授权页面-->​ 
-<​activity 
-   ​android:​name="​com.alipay.sdk.app.H5AuthActivity"​ 
-   ​android:​configChanges="​orientation|keyboardHidden|navigation|screenSize"​ 
-   ​android:​exported="​false"​ 
-   ​android:​screenOrientation="​behind"​ 
-   ​android:​windowSoftInputMode="​adjustResize|stateHidden"/>​ 
- 
-<​!--支付宝版 end--> 
- 
-<​!--钱包版需在此基础上额外添加以下activity的声明-->​ 
- 
-<​!--WebView相关页面-->​   
-<​activity 
-  android:​name="​com.easemob.redpacketui.ui.activity.RPWebViewActivity"​ 
-  android:​screenOrientation="​portrait"​ 
-  android:​windowSoftInputMode="​adjustResize|stateHidden"​ /> 
-<​!--零钱页面-->​     
-<​activity 
-  android:​name="​com.easemob.redpacketui.ui.activity.RPChangeActivity"​ 
-  android:​configChanges="​orientation|keyboardHidden|screenSize"​ 
-  android:​screenOrientation="​portrait"​ 
-  android:​windowSoftInputMode="​adjustResize|stateHidden"​ /> 
-<​!--银行卡页面-->​     
-<​activity 
-  android:​name="​com.easemob.redpacketui.ui.activity.RPBankCardActivity"​ 
-  android:​screenOrientation="​portrait"​ 
-  android:​windowSoftInputMode="​adjustPan|stateHidden"​ /> 
-<​!--转账页面-->​   
-<​activity 
-  android:​name="​com.easemob.redpacketui.ui.activity.RPTransferActivity"​ 
-  android:​screenOrientation="​portrait"​ 
-  android:​windowSoftInputMode="​adjustPan|stateVisible"/>​ 
-<​!--转账详情页面-->​           
-<​activity 
-  android:​name="​com.easemob.redpacketui.ui.activity.RPTransferDetailActivity"​ 
-  android:​screenOrientation="​portrait"​ 
-  android:​windowSoftInputMode="​adjustPan|stateHidden"/>​ 
- 
-<!-- 配置权限 --> 
-<​uses-permission android:​name="​android.permission.INTERNET"/>​ 
-<​uses-permission android:​name="​android.permission.ACCESS_NETWORK_STATE"/>​ 
-<​uses-permission android:​name="​android.permission.READ_PHONE_STATE"/>​ 
-<​uses-permission android:​name="​android.permission.WRITE_EXTERNAL_STORAGE"/>​ 
-<​uses-permission android:​name="​android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>​ 
-<!-- 钱包版需额外添加如下权限,支付宝版不需要该权限 --> 
-<​uses-permission android:​name="​android.permission.CAMERA"/>  ​ 
- </​code>​ 
-  
- ==== 3.DemoApplication初始化红包上下文 ==== 
-<code java> ​ 
- 
-    @Override 
-public void onCreate() { 
-    super.onCreate();​ 
-    //​初始化红包SDK,开启日志输出开关 
-    RedPacket.getInstance().initRedPacket(applicationContext,​ RPConstant.AUTH_METHOD_EASEMOB,​ new RPInitRedPacketCallback() { 
-        @Override 
-     public void initTokenData(RPValueCallback<​TokenData>​ callback) { 
-     TokenData tokenData = new TokenData();​ 
-     tokenData.imUserId = EMClient.getInstance().getCurrentUser();​ 
- //​此处使用环信id代替了appUserId 开发者可传入App的appUserId 
- tokenData.appUserId = EMClient.getInstance().getCurrentUser();​ 
- tokenData.imToken = EMClient.getInstance().getAccessToken();​ 
- //​同步或异步获取TokenData 获取成功后回调onSuccess()方法 
- callback.onSuccess(tokenData);​ 
- } 
- @Override 
- public RedPacketInfo initCurrentUserSync() { 
- //​这里需要同步设置当前用户id、昵称和头像url 
- String fromAvatarUrl = "";​ 
- String fromNickname = EMClient.getInstance().getCurrentUser();​ 
- EaseUser easeUser = EaseUserUtils.getUserInfo(fromNickname);​ 
- if (easeUser != null) { 
- fromAvatarUrl = TextUtils.isEmpty(easeUser.getAvatar()) ? "​none"​ : easeUser.getAvatar();​ 
- fromNickname = TextUtils.isEmpty(easeUser.getNick()) ? easeUser.getUsername() : easeUser.getNick();​ 
- } 
- RedPacketInfo redPacketInfo = new RedPacketInfo();​ 
- redPacketInfo.fromUserId = EMClient.getInstance().getCurrentUser();​ 
- redPacketInfo.fromAvatarUrl = fromAvatarUrl;​ 
- redPacketInfo.fromNickName = fromNickname;​ 
- return redPacketInfo;​ 
- } 
- }); 
-    //​打开Log开关 正式发布时请关闭 
-    RedPacket.getInstance().setDebugMode(true);​ 
-} 
-    ​ 
-</​code>​ 
- 
-==== 4. 发红包 ==== 
- 
-=== 进入发红包页面 === 
- 
-<code java>​@Override 
-public boolean onExtendMenuItemClick(int itemId, View view) { 
-        switch (itemId) { 
-        ... 
-        case ITEM_RED_PACKET://​进入红包页面 
-            //​注意:不再支持原有的startActivityForResult进入红包相关页面 
-            int itemType; 
-            if (chatType == EaseConstant.CHATTYPE_SINGLE) { 
-                itemType = RPConstant.RP_ITEM_TYPE_SINGLE;​ 
-                //​小额随机红包 
-                //itemType = RPConstant.RP_ITEM_TYPE_RANDOM;​ 
-            } else { 
-                itemType = RPConstant.RP_ITEM_TYPE_GROUP;​ 
-            } 
-            RedPacketUtil.startRedPacket(getActivity(),​ itemType, toChatUsername,​ new RPSendPacketCallback() { 
-               ​@Override 
-                public void onGenerateRedPacketId(String redPacketId) { 
- 
-                } 
-                @Override 
-                public void onSendPacketSuccess(RedPacketInfo redPacketInfo) { 
-                    //​发送红包消息到聊天页面 
-                    sendMessage(RedPacketUtil.createRPMessage(getActivity(),​ redPacketInfo,​ toChatUsername));​ 
-                } 
-            }); 
-            break; 
-        } 
-        //​不覆盖已有的点击事件 
-        return false; 
-}        </​code>​ 
- 
-=== 进入转账页面(仅支持钱包版) === 
- 
-<code java>​RedPacketUtil.startRedPacket(getActivity(),​ RPConstant.RP_ITEM_TYPE_TRANSFER,​ toChatUsername,​ new RPSendPacketCallback() { 
-                @Override 
-                public void onGenerateRedPacketId(String redPacketId) { 
- 
-                } 
-                @Override 
-                public void onSendPacketSuccess(RedPacketInfo redPacketInfo) { 
-                    sendMessage(RedPacketUtil.createTRMessage(getActivity(),​ redPacketInfo,​ toChatUsername));​ 
-                } 
-});</​code>​ 
- 
-==== 5.拆红包 ==== 
- 
-=== 拆单聊、群聊、小额随机红包的方法 === 
- 
-调用示例 
- 
-<code java>​@Override 
-public boolean onMessageBubbleClick(EMMessage message) { 
-   //​消息框点击事件,demo这里不做覆盖,如需覆盖,return true 
-   if (message.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE,​ false)){ 
-        RedPacketUtil.openRedPacket(getActivity(),​ chatType, message, toChatUsername,​ messageList);​ 
-       ​return true; 
-   } 
-   ​return false; 
-}</​code>​ 
- 
-=== 拆转账红包方法(仅支持钱包版) === 
- 
-'''​RPRedPacketUtil.getInstance().openTransferPacket(context,​ redPacketInfo)'''​ 
- 
-redPacketInfo传入参数 
- 
-  * redPacketAmount  ​   转账金额 
-  * transferTime  ​   转账时间 
-  * messageDirect  ​   消息的方向 
- 
-调用示例 
- 
-<code java>​RPRedPacketUtil.getInstance().openTransferPacket(context,​ redPacketInfo)</​code>​ 
- 
-==== 6.群红包领取回执消息的处理 ==== 
- 
-=== ChatFragment中的处理 === 
- 
-<code java>​@Override 
-public void onCmdMessageReceived(List<​EMMessage>​ messages) { 
-    for (EMMessage message : messages) { 
-        EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody();​ 
-        String action = cmdMsgBody.action();//​获取自定义action 
-        if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ 
-            RedPacketUtils.receiveRedPacketAckMessage(message);​ 
-            messageList.refresh();​ 
-        } 
-    } 
-    super.onCmdMessageReceived(messages);​ 
-}</​code>​ 
-=== MainActivity中的处理 === 
- 
-<code java>​@Override 
-public void onCmdMessageReceived(List<​EMMessage>​ messages) { 
-    for (EMMessage message : messages) { 
-        EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody();​ 
-        String action = cmdMsgBody.action();//​获取自定义action 
-        if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION) ){ 
-            RedPacketUtils.receiveRedPacketAckMessage(message);​ 
-        } 
-    } 
-    refreshUIWithMessage();​ 
-}</​code>​ 
- 
-=== 全局处理 === 
- 
-* DemoHelper中 
- 
-<code java>​@Override 
-public void onCmdMessageReceived(List<​EMMessage>​ messages) { 
-    for (EMMessage message : messages) { 
-        //​获取消息body 
-        EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody();​ 
-        final String action = cmdMsgBody.action();//​获取自定义action 
-        if(!easeUI.hasForegroundActivies()){ 
-            if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ 
-                RedPacketUtils.receiveRedPacketAckMessage(message);​ 
-                broadcastManager.sendBroadcast(new Intent(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION));​ 
-            } 
-        } 
-    } 
-}</​code>​ 
-* MainActivity中 
- 
-<code java>​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(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION);​ 
-    broadcastReceiver = new BroadcastReceiver() { 
-      
-        @Override 
-        public void onReceive(Context context, Intent intent) { 
-        ... 
-        if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ 
-            if (conversationListFragment != null){ 
-                conversationListFragment.refresh();​ 
-                } 
-            } 
-        } 
-    }; 
-    broadcastManager.registerReceiver(broadcastReceiver,​ intentFilter);​ 
-}</​code>​ 
-* 会话列表中红包回执消息的处理 
- 
-<code java>​@Override 
-protected void setUpView() { 
-    super.setUpView();​ 
-    ...    ​ 
-    //red packet code : 红包回执消息在会话列表最后一条消息的展示 
-    conversationListView.setConversationListHelper(new EaseConversationListHelper() { 
-        @Override 
-        public String onSetItemSecondaryText(EMMessage lastMessage) { 
-          if (lastMessage.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_ACK_MESSAGE,​ false)) { 
-                    String sendNick = lastMessage.getStringAttribute(RPConstant.EXTRA_RED_PACKET_SENDER_NAME,​ ""​);​ 
-                    String receiveNick = lastMessage.getStringAttribute(RPConstant.EXTRA_RED_PACKET_RECEIVER_NAME,​ ""​);​ 
-                    String msg; 
-                    if (lastMessage.direct() == EMMessage.Direct.RECEIVE) { 
-                        msg = String.format(getResources().getString(R.string.msg_someone_take_red_packet),​ receiveNick);​ 
-                    } else { 
-                        if (sendNick.equals(receiveNick)) { 
-                            msg = getResources().getString(R.string.msg_take_red_packet);​ 
-                        } else { 
-                            msg = String.format(getResources().getString(R.string.msg_take_someone_red_packet),​ sendNick); 
-                        } 
-                    } 
-                    return msg; 
-                } 
-                return null; 
-            } 
-        }); 
-        super.setUpView();​ 
-        //end of red packet code 
-    }</​code>​ 
- 
-==== 7.屏蔽红包消息的转发和撤回功能 ==== 
- 
-* ContextMenuActivity的onCreate方法 
- 
-<code java>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(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE,​ false)){ 
-         ​setContentView(R.layout.em_context_menu_for_location);​ 
-    } 
-} 
-if (isChatroom 
- //​屏蔽红包消息的撤回功能 
- || message.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE,​ false)) { 
- View v = (View) findViewById(R.id.forward);​ 
-         if (v != null) { 
-             v.setVisibility(View.GONE);​ 
-         } 
- }</​code>​ 
- 
-==== 8.进入零钱页方法(仅支持钱包版) ==== 
- 
-'''​RPRedPacketUtil.getInstance().startChangeActivity(context)'''​ 
- 
-* 获取零钱余额接口(仅支持钱包版) 
- 
-<code java>​RPRedPacketUtil.getInstance().getChangeBalance(new RPValueCallback<​String>​() { 
-        @Override 
-        public void onSuccess(String changeBalance) { 
- 
-        } 
- 
-        @Override 
-        public void onError(String errorCode, String errorMsg) { 
- 
-        } 
-});</​code>​ 
-==== 9.进入红包记录页面方法(仅支持支付宝版) ==== 
- 
-* RPRedPacketUtil.getInstance().startRecordActivity(context) 
- 
-== detachView接口 == 
- 
-* RPRedPacketUtil.getInstance().detachView() 
-* 在拆红包方法所在页面销毁时调用,可防止内存泄漏。 
-* 调用示例(以ChatFragment为例) 
- 
-<code java>​@Override 
-public void onDestroy() { 
-    super.onDestroy();​ 
-    RPRedPacketUtil.getInstance().detachView();​ 
-}</​code>​ 
- 
-==== 10.拆红包音效 ==== 
- 
-* 在assets目录下添加open_packet_sound.mp3或者open_packet_sound.wav文件即可(文件大小不要超过1M)。 
- 
- 
----- 
-<WRAP group> 
-<WRAP half column> 
-上一页:[[im:​200androidclientintegration:​95privatecloud|私有云SDK集成配置]] 
-</​WRAP>​ 
- 
-<WRAP half column> 
-下一页:[[im:​200androidclientintegration:​100iosnickname|设置当前登录用户的推送昵称]] 
-</​WRAP>​ 
-</​WRAP>​ 
- 
-  ​ 
- 
-