Прослушивание XMPP-пакетов в Android - PullRequest
3 голосов
/ 30 июня 2011

Я нашел этот вопрос: XMPP-события на Android , и ответ объясняет решение проблемы, с которой я столкнулся. Но я не могу понять, как заставить работать packageListener. Я пробовал PackageCollectors и PackageListeners, но, кажется, замечание работает.

Я не уверен, куда мне поместить слушателей пакетов. Должен ли он идти в метод onCreate () службы или в onStartCommand (), или его следует помещать в отдельный метод, который запускается каждые несколько секунд?

Моя путаница в основном связана с понятием слушателей. Слушатель всегда работает и будет запускаться, как только будет получен пакет? И как мне убедиться, что слушатель может «видеть» поступающие события пакета?

Это моя текущая попытка заставить это работать:

public class XMPPService extends Service{

    private static String TAG = "XMPPService";
    XMPPConnection connection;
    MultiUserChat muc;      

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate(){
        super.onCreate();
    }

    public int onStartCommand(Intent intent, int flags, int startId){

        ConnectionConfiguration config = new ConnectionConfiguration("jabber.org", 5222);
        connection = new XMPPConnection(config);

        try 
        {
            connection.connect();
            Log.i(TAG,"connected");
        }
        catch (XMPPException e) 
        {
            Log.e(TAG, "Connection Issue: ", e);
        }

        try 
        {
            connection.login("user", "password");

            muc = new MultiUserChat(connection, "room@conference.jabber.org");
            muc.join("nick","password");    

            Presence presence = new Presence(Presence.Type.available);
            connection.sendPacket(presence);
            setConnection(connection);
        } 
        catch (XMPPException e) 
        {
            Log.e(TAG, "Connection Issue: ", e);
        }

        makeNotification("started");

        return 1;
    }

    private void makeNotification(String msg){
        Notification notification = new Notification(R.drawable.icon, msg, System.currentTimeMillis());
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MUCTestActivity.class), 2);
        notification.setLatestEventInfo(this, "Title", msg, contentIntent);

        NotificationManager nmgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        nmgr.notify(123443, notification);
    }


    public void setConnection(XMPPConnection connection) {
        this.connection = connection;
        if (connection != null) {
            // Add a packet listener to get messages sent to us
            PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
            connection.addPacketListener(new PacketListener() {
                public void processPacket(Packet packet) {
                    Message message = (Message) packet;
                    if (message.getBody() != null) {
                        String fromName = StringUtils.parseBareAddress(message.getFrom());
                        Log.i(TAG, "Got text [" + message.getBody() + "] from [" + fromName + "]");
                    }
                    else
                    {
                        Log.i(TAG,"null");
                    }
                }
            }, filter);
        }
    }

}

1 Ответ

1 голос
/ 01 июля 2011

Часть PacketListener выглядит правильно. Он будет подключен к соединению smacks (поток чтения) и будет вызываться соединением, если поступит пакет, соответствующий фильтру. Вы правильно поняли концепцию. Возвращение START_STICKY (пожалуйста, используйте здесь константу, а не значение) также должно помочь сохранить службу и, следовательно, соединение живым.

Видите ли вы JID соединения онлайн? Я не уверен, можно ли всегда отправлять сообщения в JID, не входя в реестр JID. Попробуйте включить отладку в smack: Connection.DEBUG_ENABLED = true. Если у вас есть asmack, все отладочные сообщения попадут в журнал СУБД. Также эмулятор и затмение с точками останова являются мощными инструментами, которые помогут вам проанализировать проблему.

...