code: public void recallMessage(final AVIMMessage message, final AVIMMessageRecalledCallback callback) {
      if (null == message) {
        if (null != callback) {
          callback.internalDone(new AVException(new IllegalArgumentException("message shouldn't be null")));
        }
        return;
      }
      final AVIMCommonJsonCallback tmpCallback = new AVIMCommonJsonCallback() {
        @Override
        public void done(Map<String, Object> result, AVIMException e) {
          if (null != e || null == result) {
            if (null != callback) {
              callback.internalDone(null, e);
            }
          } else {
            long patchTime = 0;
            if (result.containsKey(Conversation.PARAM_MESSAGE_PATCH_TIME)) {
              patchTime = (Long) result.get(Conversation.PARAM_MESSAGE_PATCH_TIME);
            }
            AVIMRecalledMessage recalledMessage = new AVIMRecalledMessage();
            copyMessageWithoutContent(message, recalledMessage);
            recalledMessage.setUpdateAt(patchTime);
            recalledMessage.setMessageStatus(AVIMMessage.AVIMMessageStatus.AVIMMessageStatusRecalled);
            updateLocalMessage(recalledMessage);
  
            if (null != callback) {
              callback.internalDone(recalledMessage, null);
            }
          }
        }
      };
      InternalConfiguration.getOperationTube().recallMessage(client.getClientId(), getType(), message, tmpCallback);
    }
docs: racall message
  @param message the message need to be recalled
  @param callback