咂4.2传入的消息

时间:2017-07-09 15:56:25

标签: android listener message smack

我现在可以发送masseges,我的下一步是接收传入的消息。我正在寻找很多方法。其中大多数都是在我的版本的smack中被删除或不可用。即时通讯使用smack 4.2.0。也许有人可以告诉我如何以及在哪里实现一个能够捕获所有传入消息的监听器? 在这里我的代码:

MainActivity.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);


            }
        });


    }
    }

connectXmpp.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();
        }

    }

}

2 个答案:

答案 0 :(得分:2)

在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或未设置,则所有传入的消息都将保存在离线消息存储中,并且不会触发界面。

希望这有帮助。

答案 1 :(得分:0)

您可以通过以下方式收听传入消息:

    //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
        }
    }
}