在集成AUI Kits后,如果您需要实现弹幕、送礼、电商购物车等个性化功能,需要自定义互动消息。本文通过观众给主播送礼物举例介绍自定义互动消息的全链路流程。

操作步骤

  1. 自定义消息体。

    自定义观众给主播送礼物的业务字段,如下所示:

    @MessageType(30001)
    public class GiftModel implements Serializable {
        public String id; //礼物ID
        public String name; //礼物名称
        public String description; //礼物描述
        public String imageUrl; //礼物图片地址
    }
    说明 @MessageType为自定义消息类型,规则如下:
    • 消息类型取值必须大于10000,否则会报错;消息类型取值小于等于10000为互动消息SDK的内部保留类型。
    • 消息类型不能与其他自定义消息的类型重复,其他消息类型请参见com.aliyun.aliinteraction.roompaas.message.model包下的实体类,当前AUI所有自定义消息实体均在此包下。
    • 消息体不需要携带发送者ID和昵称,互动消息SDK会在所有消息接收的回调中默认添加这些字段,不需要在此重复添加。
  2. 发送消息。
    1. AUIMessageService接口中定义送礼物消息的方法。
      /**
       * 送礼物
       *
       * @param model    礼物消息体
       * @param anchorId 主播ID
       * @param callback 回调函数
       */
      void sendGift(GiftModel model, String anchorId, Callback<String> callback);
    2. AUIMessageServiceImpl类中实现上述送礼物消息的方法。
      @Override
      public void sendGift(GiftModel model, String anchorId, Callback<String> callback) {
          doSendMessage(model, anchorId, callback);
      }
      说明 实现送礼物消息只需调用当前类中现有的doSendMessage方法,对应参数含义如下:
      • 参数anchorId为directUserId,指定该值时为私聊消息,表示只有当前Group下的指定用户才能收到消息;如果不指定该值,即传null时,表示为全员消息,此时当前Group下的全体成员均能收到消息。
      • 参数callback为发送消息到服务端的本次RPC调用的回调函数,上层根据业务需要传递,不关注时可传null。
  3. 接收消息。
    1. AUIMessageListener接口中定义接收礼物的回调函数。
      /**
       * 收到送礼物消息
       *
       * @param message 消息体
       */
      void onGiftReceived(Message<GiftModel> message);
    2. SimpleOnMessageListener类中添加上述接收礼物回调函数的空实现。
      @Override
      public void onGiftReceived(Message<GiftModel> message) {
      
      }
  4. 上层调用。
    • 观众端
      GiftModel model = new GiftModel();
      model.id = "<礼物ID>";
      model.name = "<礼物名称>";
      model.description = "<礼物描述>";
      model.imageUrl = "<礼物图片地址>";
      getMessageService().sendGift(model, getAnchorId(), null);
      说明 getAnchorIdBaseComponent中的基类方法,所有子Component均可直接调用。
    • 主播端
      getMessageService().addMessageListener(new SimpleOnMessageListener() {
          @Override
          public void onGiftReceived(Message<GiftModel> message) {
              String senderId = message.senderId;
              String senderNick = message.senderInfo.userNick;
              GiftModel giftModel = message.data;
              showToast(String.format("%s给你送来了%s", senderNick, giftModel.name));
          }
      });