【问题标题】:Custom extension element in Stanza for Smack 4.1.4Stanza for Smack 4.1.4 中的自定义扩展元素
【发布时间】:2015-10-05 03:29:57
【问题描述】:

我正在将我的 android 应用程序从 asmack-android 库移动到 Smack 4.1.4。我在 Smack 的 asmack 版本中有一些 PacketExtensions,它使用 PacketExtension 和 PacketExtensionProvider 类来处理。由于 PacketExtension 在 Smack 4.1.4 中已弃用,我对 ExtensionElement、DataPacketExtension、ExtensionElementProvider 和 DefaultExtensionElement 类和接口感到困惑。你们中的任何人都可以给我一个创建扩展的示例,该扩展可以添加节并解析回来...https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware /smack/packet/DefaultExtensionElement.htmlhttps://www.igniterealtime.org/builds/smack/docs /latest/javadoc/org/jivesoftware /smack/provider/ExtensionElementProvider.html

【问题讨论】:

    标签: smack asmack


    【解决方案1】:
    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    Log.e("message --->", message.toXML().toString());
    

    这将产生以下节

    <message id='923442621149' type='chat'><body>shanraisshan</body></message>
    

    1。 自定义扩展节类型 1

    为了生成下面的自定义扩展节

    <message id='923442621149' type='chat'><body>shanraisshan</body>
    <reply xmlns='shayan:reply' rText='this is custom attribute'/>
    </message>
    

    其中 reply 是自定义扩展,其中包含

    1. 元素(回复)
    2. 命名空间 (shayan:reply)

    默认 xmpp 命名空间列表位于 Official XMPP website

    执行以下步骤

    1.在您的项目中添加 ReplyExtension.java

    ReplyExtension.java

    package com.xmpp.extensions;
    
    import org.jivesoftware.smack.packet.DefaultExtensionElement;
    import org.jivesoftware.smack.packet.ExtensionElement;
    import org.jivesoftware.smack.provider.EmbeddedExtensionProvider;
    import org.jivesoftware.smack.util.XmlStringBuilder;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Shayan Rais (http://shanraisshan.com)
     * created on 9/7/2016
     */
    public class ReplyExtension implements ExtensionElement  {
    
        public static final String NAMESPACE = "shayan:reply";
        public static final String ELEMENT = "reply";
    
        String rText = null;
    
        static final String ATTRIBUTE_REPLY_TEXT = "rText";
    
        @Override
        public String getElementName() {
            return ELEMENT;
        }
    
        @Override
        public String getNamespace() {
            return NAMESPACE;
        }
    
        @Override
        public XmlStringBuilder toXML() {
            XmlStringBuilder xml = new XmlStringBuilder(this);
            xml.attribute(ATTRIBUTE_REPLY_TEXT, getReplyText());
            xml.closeEmptyElement();
            return xml;
        }
    
    //__________________________________________________________________________________________________
        public void setReplyText(String _rText) {
            rText = _rText;
        }
    
        public String getReplyText() {
            return rText;
        }
    
    //__________________________________________________________________________________________________
        public static class Provider extends   EmbeddedExtensionProvider<ReplyExtension> {
            @Override
            protected ReplyExtension createReturnExtension(String    currentElement, String currentNamespace, Map<String, String> attributeMap,    List<? extends ExtensionElement> content) {
                ReplyExtension repExt = new ReplyExtension();
                repExt.setReplyText(attributeMap.get(ATTRIBUTE_REPLY_TEXT));
                return repExt;
            }
        }
    }
    

    2.在您的 Provider Manager 中注册 ReplyExtension

    ProviderManager.addExtensionProvider(ReplyExtension.ELEMENT, ReplyExtension.NAMESPACE, new ReplyExtension.Provider());
    

    用于发送消息

    您可以使用以下代码生成自定义扩展节 TYPE-1

    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    //adding custom reply extension
    ReplyExtension repExt = new ReplyExtension();
    repExt.setReplyText("this is custom attribute");
    message.addExtension(repExt);
    Log.e("message --->", message.toXML().toString());
    

    在接收消息期间

    现在在接收自定义扩展节时,您需要强制转换扩展以获取属性值。

    //check for message with reply extension
    ExtensionElement packetExtension =  message.getExtension(ReplyExtension.NAMESPACE);
    ReplyExtension repExt = (ReplyExtension)packetExtension;
    if(repExt!=null) {
        Log.e("--->", " ---  LOG REPLY EXTENSION ---");
        Log.e("--->", repExt.toXML() + "");
        Log.e("--->", repExt.getReplyText() + ""); //this is custom attribute
    }
    

    ______________________________________________

    2。 自定义扩展节类型 2

    为了生成下面的自定义扩展节

    <message id='923442621149' type='chat'><body>shanraisshan</body>
    <reply xmlns='shayan:reply'><rText>this is custom attribute</rText></reply>
    </message>
    

    用于发送消息

    您可以使用以下代码生成自定义扩展节 TYPE-2

    Message message = new Message();
    message.setStanzaId("923442621149");
    message.setType(Type.chat);
    message.setBody("shanraisshan");
    //adding custom reply extension
    DefaultExtensionElement repExt = new DefaultExtensionElement("reply", "shayan:reply");
    repExt.setValue("rText", "this is custom attribute");
    message.addExtension(repExt);
    Log.e("message --->", message.toXML().toString());
    

    在接收消息期间

    DefaultExtensionElement repExt = (DefaultExtensionElement) message.getExtension("shayan:reply");
    if(repExt!=null) {
        Log.e("--->", " ---  LOG REPLY EXTENSION ---");
        Log.e(getClass().getSimpleName(), repExt.getValue("rText"));
    }
    

    【讨论】:

      【解决方案2】:

      终于想通了....这是解决方案...

      import org.jivesoftware.smack.packet.DefaultExtensionElement;
      
      public class IM_FileSharing_Extension extends DefaultExtensionElement implements
          IM_Commons_Extension_FileSharing {
      
      private String fileUrl;
      private String fileType;
      private String base64preview;
      private String fileId;
      private String fileSize;
      
      public IM_FileSharing_Extension(String fileUrl, String fileType,
              String base64preview, String fileId, String fileSize) {
          super(FILE_TAG, XMLNS);
          this.fileUrl = fileUrl;
          this.fileType = fileType;
          this.base64preview = base64preview;
          this.fileId = fileId;
          this.fileSize = fileSize;
      }
      
      @Override
      public String toXML() {
      
          StringBuilder sb = new StringBuilder("<" + FILE_TAG + " xmlns=\""
                  + XMLNS + "\" ");
          sb.append(FILE_URL + "=\"" + fileUrl + "\" ");
          sb.append(FILE_ID + "=\"" + fileId + "\" ");
          sb.append(FILE_TYPE + "=\"" + fileType + "\" ");
          sb.append(FILE_SIZE + "=\"" + fileSize + "\">");
          sb.append("<" + FILE_PREVIEW_TAG + ">" + base64preview + "</"
                  + FILE_PREVIEW_TAG + ">");
          sb.append("</" + FILE_TAG + ">");
      
          return sb.toString();
      }
      
      public String getFileUrl() {
          return fileUrl;
      }
      
      public void setFileUrl(String fileUrl) {
          this.fileUrl = fileUrl;
      }
      
      public String getBase64preview() {
          return base64preview;
      }
      
      public void setBase64preview(String base64preview) {
          this.base64preview = base64preview;
      }
      
      public String getFileId() {
          return fileId;
      }
      
      public void setFileId(String fileId) {
          this.fileId = fileId;
      }
      
      public String getFileType() {
          return fileType;
      }
      
      public void setFileType(String fileType) {
          this.fileType = fileType;
      }
      
      public String getFileSize() {
          return fileSize;
      }
      
      public void setFileSize(String fileSize) {
          this.fileSize = fileSize;
      }
      
      }
      

      上述扩展的提供者如下...

      import java.io.IOException;
      
      import org.jivesoftware.smack.SmackException;
      import org.jivesoftware.smack.provider.ExtensionElementProvider;
      import org.xmlpull.v1.XmlPullParser;
      import org.xmlpull.v1.XmlPullParserException;
      
      import android.util.Log;
      
      public class IM_FileSharingExtension_Provider extends
          ExtensionElementProvider<IM_FileSharing_Extension> implements
          IM_Commons_Extension_FileSharing {
      static final String TAG = "file_extension";
      
      @Override
      public IM_FileSharing_Extension parse(XmlPullParser parser, int initialDepth)
              throws XmlPullParserException, IOException, SmackException {
      
          IM_FileSharing_Extension fileExtension = null;
      
          boolean stop = false;
      
          String n = null;
      
          int evtType;
      
          String fileUrl = null;
          String fileType = null;
          String fileId = null;
          String fileSize = null;
          while (!stop) {
      
              evtType = parser.getEventType();
              n = parser.getName();
              Log.d(TAG, "n:" + n + " evt:" + evtType);
              switch (evtType) {
      
              case XmlPullParser.START_TAG:
      
                  if (FILE_TAG.equals(n)) {
      
                      fileUrl = parser.getAttributeValue("", FILE_URL);
      
                      fileType = parser.getAttributeValue("", FILE_TYPE);
      
                      fileId = parser.getAttributeValue("", FILE_ID);
      
                      fileSize = parser.getAttributeValue("", FILE_SIZE);
      
                      evtType = parser.next();
      
                  }
      
                  if (FILE_PREVIEW_TAG.equals(parser.getName())) {
                      String basePreview = parser.nextText();
                      fileExtension = new IM_FileSharing_Extension(fileUrl,
                              fileType, basePreview, fileId, fileSize);
                  }
      
                  evtType = parser.next();
      
                  break;
      
              case XmlPullParser.END_TAG:
      
                  if (parser.getName().equals(FILE_TAG)) {
                      return fileExtension;
                  }
                  evtType = parser.next();
      
              }
      
          }
          return null;
      }
      
      }
      

      并且应该在Provider manager中添加如下......

      ProviderManager.addExtensionProvider(
                  IM_Commons_Extension_FileSharing.FILE_TAG,
                  IM_Commons_Extension_FileSharing.XMLNS,
                  new IM_FileSharingExtension_Provider());
      

      【讨论】:

        猜你喜欢
        • 2014-09-20
        • 2019-12-11
        • 2013-08-02
        • 2022-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多