2015-05-11 5 views
5

I benutzerdefinierte Attribut (nick) in meinem XMPP Chat-Nachricht hinzufügen möchten, wie das folgende BeispielWie kann ich benutzerdefinierte Attribute (nick) in meinem XMPP Nachricht Tag hinzufügen, in Smack 4.1

<message from='*' to='*' id='123' nick='KASHIF' type='chat'><body>hello</body></message> 

I wissen, es ist nicht empfohlen von XMPP, aber es ist meine Voraussetzung, wie diese Attribut (Nick) ist bereits in der iOS-Version der App implementiert, die ich arbeite.

Antwort

3

Hierfür benötigen Sie 2 Klassen von Smack zu bearbeiten 4,1

  • Stanza Klasse in (org.jivesoftware.smack.packet)
  • PacketParserUtils Klasse in (org.jivesoftware .smack.util)

1. Stanza Klasse

Definieren Sie Ihre benutzerdefinierte Attribut (nick)

private String nick = null; 

definieren Getter und Setter

public String getNick() { 
    return this.nick; 
} 

public void setNick(String paramString) { 
    this.nick = paramString; 
} 

bearbeiten Stanza Constructor

protected Stanza(Stanza p) { 

    //add this line 
    nick = p.getNick(); 

} 
Bearbeiten

addCommonAttributes Methode

protected void addCommonAttributes(XmlStringBuilder xml) { 

    //add this line 
    if(getNick()!= null) 
     xml.optAttribute("nick", getNick()); 
} 

2.PacketParserUtils Klasse

bearbeiten parseMessage Methode

public static Message parseMessage(XmlPullParser parser) 
       throws XmlPullParserException, IOException, SmackException { 

    //add this line 
    message.setNick(parser.getAttributeValue("", "nick")); 

} 

Jetzt können Sie einfach nick gesetzt und senden Mitteilung als

Message message = new Message(); 
message.setType(Message.Type.chat); 
message.setStanzaId("123"); 
message.setTo(number); 

message.setNick("SHAYAN");  

try { 
connection.sendStanza(message); 
} catch (NotConnectedException e) { 
} 
+0

Hallo Shanrais !, klonte ich Smack von Github und ich zwei Klassen bearbeitet. Aber, du hast nicht gesagt, wie man smack und jars erneut auf Android mit rechts setzen? –

+0

Anstatt Jars zu erstellen, habe ich den Quellcode des Jars, den ich in meinem Projekt bearbeitet habe, enthalten. – shanraisshan

+0

können Sie sagen, welche Ordner kopiert werden müssen? Habe viele Ordner im Projekt https://github.com/igniterealtime/Smack auf Github, ich weiß nicht, welche Ordner in mein Projekt kopiert werden müssen. Folgende in meiner App deklarierte Dateien: compile 'org.igniterealtime.smack: smack-android-extensions: 4.1.1' kompilieren 'org.ignitorealtime.smack: smack-experimental: 4.1.1' compile 'org.igniterealtime. smack: smack-tcp: 4.1.1 ' –

4

Tun Sie das nicht, es wird nicht aus einem Grund empfohlen. Es ist sehr wahrscheinlich, dass einige Server das Attribut entfernen oder sich sogar weigern, das Paket zu verarbeiten. Stattdessen empfiehlt es sich, ein benutzerdefiniertes Element hinzuzufügen.

In der Tat, eine solche Erweiterung bereits vorhanden ist, XEP-0172:

<message from='*' to='*' id='123' type='chat'> 
    <nick xmlns='http://jabber.org/protocol/nick'>KASHIF</nick> 
    <body>hello</body> 
</message> 

Dies könnte bereits mit anderen Kunden oder Bibliotheken arbeiten, es ist so eine viel bessere Lösung.

+0

in meinem Fall folgt, wird dies die iOS-Version abstürzen die App –

+0

Dann machst du etwas anderes sehr falsch. – xnyhps

+0

Sie haben Recht, aber es hängt von der Bibliothek ab. – Ricardo

Verwandte Themen