使用 Smack Android 将字符串转换为 XMPP 节

Posted

技术标签:

【中文标题】使用 Smack Android 将字符串转换为 XMPP 节【英文标题】:Convert String to XMPP Stanza using Smack Android 【发布时间】:2016-09-09 06:55:24 【问题描述】:

Q) 从字符串生成 XMPP 节。

Q) 将字符串转换为 XMPP Stanza。

通过在 android 中使用 Smack 库,

Message message = new Message();
message.setStanzaId("123");
message.setFrom("923442621149");
message.setType(Message.Type.chat);
message.setBody("shanraisshan");

final String msgString = message.toXML().toString();
Log.e("message --->", msgString);

上面的代码在下面的节中生成

msgString:

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

我已将此 msgString 保存到我的数据库中。

现在,我想做的是,从数据库中检索这个字符串

将此 msgString 转换回 Java Message 类 这样我就可以使用属性(From、Body、Id) 使用 message.getFrom()

由于 MessageStanza 的子类,我尝试了以下代码:

Stanza stanza = new Stanza() 
    @Override
    public CharSequence toXML() 
        return msgString;
    
;
Log.e("stanza XML --->", stanza.toXML().toString());
Log.e("stanza getFrom() ->", stanza.getFrom() + ":");
Log.e("stanza getStanzaId() ->", stanza.getStanzaId() + ":");

控制台日志打印如下

stanza XML --->: <message from='923442621149' id='123' type='chat'><body>shanraisshan</body></message>
stanza getFrom() ->: null:
stanza getStanzaId() ->: OtU0i-29:

我无法理解,为什么

stanza.toXML().toString() 打印正确的节,而

stanza.getFrom() 是 null 而不是 923442621149

李>

stanza.getStanzaId() 是 OtU0i-29 而不是 123


另外,在将 Stanza 转换为 Message 时,会产生 ClassCastException

Message castedMsg = (Message)stanza;

生产

java.lang.ClassCastException:

简化事情

如何转换msgString

msgString = "<message from='923442621149' id='123' type='chat'><body>shanraisshan</body></message>";

进入 org.jivesoftware.smack.packet.Message 类?

【问题讨论】:

【参考方案1】:

经过Smack Library source code on Github后,我发现库正在使用PacketParserUtils.java方法的parseStanza()将String转换为Stanza。

String  msgString = "<message from='923442621149' id='123' type='chat'><body>shanraisshan</body></message>";
Message message = (Message)PacketParserUtils.parseStanza(msgString);

Log.e("message XML->", message.toXML().toString());
Log.e("message getFrom()->", message.getFrom() + ":"); //923442621149:
Log.e("message getStanzaId()->", message.getStanzaId() + ":"); //123:

【讨论】:

这将不再适用于 Smack 4.3.+,因为 message 标记中缺少命名空间。最好自己解析 XML。参考developer.android.com/reference/org/xmlpull/v1/XmlPullParser

以上是关于使用 Smack Android 将字符串转换为 XMPP 节的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义字段放入 XMPP vCard Android/SMACK

在 android 上使用 smack 面临问题

asmack/Smack 4.1 on android 设置

Android 聊天是不是有任何 Openfire smack 替代方案?

在 Android 的 SmackInitialization 中无法获得 smack 版本

在android中使用Smack的ejabberd连接给出连接超时错误