Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将自定义扩展(时间)添加到<;信息>;标签?_Android_Time_Xmpp_Message - Fatal编程技术网

Android 如何将自定义扩展(时间)添加到<;信息>;标签?

Android 如何将自定义扩展(时间)添加到<;信息>;标签?,android,time,xmpp,message,Android,Time,Xmpp,Message,我正在尝试使用自定义数据包扩展为消息添加时间扩展。发送消息时,时间似乎会增加。但在接收端,它显示null 这是我的数据包扩展类和EmbeddedExtensionProvider public class TimestampExtension implements PacketExtension { public static final String ELEMENT = "timestamp"; public static final String NAMESPACE = "

我正在尝试使用自定义数据包扩展为消息添加时间扩展。发送消息时,时间似乎会增加。但在接收端,它显示null

这是我的数据包扩展类和EmbeddedExtensionProvider

public class TimestampExtension implements PacketExtension {

    public static final String ELEMENT = "timestamp";
    public static final String NAMESPACE = "urn:xmpp:timestamp";

    public String TIME = null;

    public TimestampExtension() {

    }

    public void setTime() {
        SimpleDateFormat time = new SimpleDateFormat("hh:mm a");
        Date dateTime = new Date();
        String strTime = time.format(dateTime);
        this.TIME = strTime;
    }

    public String getTime() {
        return TIME;
    }

    @Override
    public String getElementName() {
        return ELEMENT;
    }

    @Override
    public String getNamespace() {
        return NAMESPACE;
    }

    @Override
    public String toXML() {
        return "<" + ELEMENT + " xmlns='" + NAMESPACE + "'><time>" + TIME
            + "</time></" + ELEMENT + ">";
    }

    public static class Provider extends EmbeddedExtensionProvider {

        @Override
        protected PacketExtension createReturnExtension(String arg0,
            String arg1, Map<String, String> arg2,
            List<? extends PacketExtension> arg3) {

            return new TimestampExtension();
        }
    }
}
发送带有扩展名的消息

TimestampExtension timeExt = new TimestampExtension();
timeExt.setTime();
msg.addExtension(timeExt);
connection.sendPacket(msg);
//Creating Standard packet extension with name as 'timestamp' and urn as 'urn:xmpp:timestamp'
 StandardExtensionElement extTimeStamp = StandardExtensionElement.builder(
        "timestamp", "urn:xmpp:timestamp")
        .addAttribute("timestamp", String.valueOf(System.currentTimeMillis()))  //Setting value in extension
        .build();


//Add extension to message tag
message.addExtension(extTimeStamp);
发件人处的邮件xml输出:

<message id="m55K5-7" to="testfirzan@sushant" type="chat">
<body>hi</body><request xmlns='urn:xmpp:receipts'/>
<timestamp xmlns='urn:xmpp:timestamp'>
<time>01:04 PM</time>
</timestamp>

你好
下午1时04分

接收方的消息xml输出:

<message id="m55K5-7" to="testfirzan@sushant" from="testsushant@sushant/Smack" type="chat">
<body>hi</body><request xmlns='urn:xmpp:receipts'/>
<timestamp xmlns='urn:xmpp:timestamp'>
<time>null</time>
</timestamp>

你好
无效的


它应该在时间元素中显示发送时间。我做错了什么?

问题出在您的提供商身上

        return new TimestampExtension();

解析消息时,您需要从XmlPullParser获取时间元素,并将其设置为扩展实例。

抱歉,各位回答得太晚了

因为时间对我来说是强制性参数,所以我最终使用了
DefaultPacketExtension

//To sent message
private void sendMessage(String message, String recipient) {

    Message msg = new Message(recipient, Message.Type.chat);
    msg.setBody(message);

    //Getting current timestamp in string format
    String messageTimeStamp = String.valueOf(System.currentTimeMillis());

    //Creating default packet extension with name as 'timestamp' and urn as 'urn:xmpp:timestamp'
    DefaultPacketExtension extTimeStamp = new DefaultPacketExtension(
                                        "timestamp", "urn:xmpp:timestamp");

    //Setting value in extension
    extTimeStamp.setValue("timestamp", messageTimestamp);

    //Add extension to message tag
    msg.addExtension(extTimeStamp);

    //Send message
    xmppConnection.sendPacket(message);
}


//To receive and parse message with extension implement PacketListener
@Override
public void processPacket(Packet packet) {

    Message message = (Message) packet;

    //Get the extension from message
    DefaultPacketExtension extTimestamp = (DefaultPacketExtension) message
                    .getExtension("urn:xmpp:timestamp");

    //Get the value from extension
    long timestamp = Long.parseLong(extTimestamp.getValue("timestamp"));

    System.out.println("Message :" + message.getBody() + " Timestamp: "+timestamp);
}

Sushant的回答是正确的,但在最新版本的
org.igniterealtime.smack:smack android:4.2.0-beta2
中,他们将
DefaultPacketExtension
更改为
StandardExtensionElement
,以便在消息中添加自定义元素

添加扩展名的代码

TimestampExtension timeExt = new TimestampExtension();
timeExt.setTime();
msg.addExtension(timeExt);
connection.sendPacket(msg);
//Creating Standard packet extension with name as 'timestamp' and urn as 'urn:xmpp:timestamp'
 StandardExtensionElement extTimeStamp = StandardExtensionElement.builder(
        "timestamp", "urn:xmpp:timestamp")
        .addAttribute("timestamp", String.valueOf(System.currentTimeMillis()))  //Setting value in extension
        .build();


//Add extension to message tag
message.addExtension(extTimeStamp);

希望这将对未来的开发人员有所帮助。

我还没有解析消息,因为所需的时间元素为空。我认为服务器在
time
元素中降低了值。