Smack 4.2 传入消息



我现在可以发送马塞格斯,下一步是接收传入的消息。 我正在寻找很多方法.它们中的大多数在我的 smack 版本中都经过练习或不可用。IM 使用 SMAK 4.2.0。也许有人可以告诉我如何以及在何处实现捕获所有传入消息的侦听器? 这是我的代码:

主要活动.class

Package com.example.saddam.xmpp3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jxmpp.stringprep.XmppStringprepException;
public class MainActivity extends AppCompatActivity {
Button b1;
TextView chat;
final  connectXmpp con = new connectXmpp();
public MainActivity() throws XmppStringprepException {
}
@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
con.execute();
b1 = (Button) findViewById(R.id.button);
chat = (TextView) findViewById(R.id.editText);

b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AbstractXMPPConnection conn=con.getConnection();
con.sendMessage(conn,chat);

}
});

}
}

连接Xmpp.class

import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;

import java.io.IOException;

/**
* Created by saddam on 08.07.2017.
*/
public class connectXmpp extends AsyncTask<Void,Void,Void> {
static AbstractXMPPConnection conn2= null;

final EntityBareJid jid   = JidCreate.entityBareFrom("hss404@im.koderoot.net");
public connectXmpp() throws XmppStringprepException {
}
@Override
protected Void doInBackground(Void... voids) {
XMPPTCPConnectionConfiguration config = null;
try {
config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword("username", "password")
.setXmppDomain("dismail.de")
.setHost("dismail.de")
.setPort(5222).setKeystoreType(null)
.build();
} catch (XmppStringprepException e) {
e.printStackTrace();
}
conn2 = new XMPPTCPConnection(config);
try {
conn2.connect();
conn2.login();

} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (SmackException e1) {
e1.printStackTrace();
} catch (XMPPException e1) {
e1.printStackTrace();
}


return null;
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
public AbstractXMPPConnection getConnection(){
return conn2;
}
public ChatManager getChatMana(AbstractXMPPConnection c){
ChatManager chatManager = ChatManager.getInstanceFor(c);
return chatManager;
}
public void sendMessage(final AbstractXMPPConnection c, TextView t){
ChatManager chatManager = null;
Message newMessage = null;
chatManager = ChatManager.getInstanceFor(c);
try {

Chat chat = chatManager.chatWith(jid);
newMessage = new Message();
newMessage.setBody(t.getText().toString());
chat.send(newMessage);

} catch (InterruptedException e) {
e.printStackTrace();
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
}

在Smack 4.2中,您可以使用以下接口:IncomingChatMessageListener

示例代码:

ChatManager chatManager = ChatManager.getInstanceFor(mConnection);
chatManager.addIncomingListener(new IncomingChatMessageListener() {
@Override
public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
// Your code to handle the incoming message
}
});

您还必须将以下语句添加到XMPPTCPConnectionConfiguration:

.setSendPresence(true)

如果状态为 false 或未设置,则所有传入消息都将保存在脱机消息存储中,并且不会触发接口。

希望这有帮助。

侦听传入消息的方式如下所示:

//Declare your stanza listener
private MessagePacketListener messagePacketListener;
//In your cotnructor   
messagePacketListener = new MessagePacketListener(context);
//Then in your login method register your stanza listener like this
public void login() throws SmackInvocationException, XmppStringprepException {
connect();
try {
if (!con.isAuthenticated()) {
setupOmemo(con);
....
con.addSyncStanzaListener(messagePacketListener, new StanzaTypeFilter(Message.class));
....
initOmemo();
}
} catch(Exception e) {
....
}
}
//Now you have your MessagePacketListener that process the incoming messages
public class MessagePacketListener implements StanzaListener{
private Context context;
MessagePacketListener(Context context) {
this.context = context;
}
@Override
public void processStanza(Stanza packet) {
Message msg = (Message)packet;
//Message that have body
if(msg.getBodies().size() > 0){
//Text message
//Do something with message msg.getBody()
}
else{
//This must be sth like delivery receipt or Chat state msg
}
}
}

最新更新