在集成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));
          }
      });