Stanza for Smack 4.1.4中的自定义扩展元素

Ram*_*Ram 2 smack asmack

我正在将我的android应用程序从asmack-android库移动到Smack 4.1.4.我在Smack的asmack版本中有一些PacketExtensions,它使用PacketExtension和PacketExtensionProvider类来处理.由于在Smack 4.1.4中不推荐使用PacketExtension,因此我对类和接口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

sha*_*han 20

Message message = new Message();
message.setStanzaId("923442621149");
message.setType(Type.chat);
message.setBody("shanraisshan");
Log.e("message --->", message.toXML().toString());
Run Code Online (Sandbox Code Playgroud)

这将产生以下节

<message id='923442621149' type='chat'><body>shanraisshan</body></message>
Run Code Online (Sandbox Code Playgroud)

1. CUSTOM EXTENSION STANZA TYPE-1

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

<message id='923442621149' type='chat'><body>shanraisshan</body>
<reply xmlns='shayan:reply' rText='this is custom attribute'/>
</message>
Run Code Online (Sandbox Code Playgroud)

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

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

官方XMPP网站上提供了默认的xmpp命名空间列表

请执行以下步骤

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2.在您的提供者管理器中注册ReplyExtension

ProviderManager.addExtensionProvider(ReplyExtension.ELEMENT, ReplyExtension.NAMESPACE, new ReplyExtension.Provider());
Run Code Online (Sandbox Code Playgroud)

用于发送消息

您可以使用以下代码生成自定义扩展节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());
Run Code Online (Sandbox Code Playgroud)

在收到消息期间

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

//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
}
Run Code Online (Sandbox Code Playgroud)

_______________________________________________________

2. CUSTOM EXTENSION STANZA TYPE-2

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

<message id='923442621149' type='chat'><body>shanraisshan</body>
<reply xmlns='shayan:reply'><rText>this is custom attribute</rText></reply>
</message>
Run Code Online (Sandbox Code Playgroud)

用于发送消息

您可以使用以下代码生成自定义扩展节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());
Run Code Online (Sandbox Code Playgroud)

在收到消息期间

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