Не могу получить автономные сообщения, используя Asmack API для приложения Gtalk - PullRequest
4 голосов
/ 16 марта 2012

Я создаю приложение чата для Gtalk, используя asmack api, и я хочу получать сообщения, когда пользователь выходит из сети, но получаю проблемы из-за некоторых проблем в ServiceDiscoveryManager и его высказываниях о том, что эта функция не реализована (501) и пытался реализует все то, что другие пользователи имеют ту же проблему, но теперь я получаю эту ошибку. Я публикую код и logcat с этим. любая помощь приветствуется.

 ConnectionConfiguration connConfig = new ConnectionConfiguration(
                    host, Integer.parseInt(port), service);
 connConfig.setSASLAuthenticationEnabled(true);
 connConfig.setSendPresence(false);
 connection = new XMPPConnection(connConfig);
 connection.connect();
 connection.login(username, password);
 ServiceDiscoveryManager sdm= ServiceDiscoveryManager.getInstanceFor(connection);
 mOfflineMessageManager = new OfflineMessageManager(connection);
 offlinemsgs = mOfflineMessageManager.getMessageCount(); 

это код, по которому я вызываю автономные сообщения сразу после входа в систему, а ниже приведен ответ в ошибке logcat:

03-16 11:26:53.871: W/System.err(325): feature-not-implemented(501)
03-16 11:26:53.881: W/System.err(325):  at org.jivesoftware.smackx.OfflineMessageManager.getMessages(OfflineMessageManager.java:210)
03-16 11:26:53.881: W/System.err(325):  at com.apache.android.xmpp.MainScreen.getOfflinemessages(MainScreen.java:911)
03-16 11:26:53.881: W/System.err(325):  at com.apache.android.xmpp.MainScreen$LogIn.doInBackground(MainScreen.java:612)
03-16 11:26:53.881: W/System.err(325):  at com.apache.android.xmpp.MainScreen$LogIn.doInBackground(MainScreen.java:1)
03-16 11:26:53.881: W/System.err(325):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-16 11:26:53.881: W/System.err(325):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-16 11:26:53.881: W/System.err(325):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-16 11:26:53.881: W/System.err(325):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-16 11:26:53.881: W/System.err(325):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-16 11:26:53.891: W/System.err(325):  at java.lang.Thread.run(Thread.java:1096)

, пожалуйста, помогите в этом, пытаясь найти решение в течение многих дней, но не можете найти какое-либо решение.

Ответы [ 3 ]

7 голосов
/ 22 марта 2012

попробуйте это:

 ConnectionConfiguration connConfig = new ConnectionConfiguration(
                    host, Integer.parseInt(port), service);
 connConfig.setSASLAuthenticationEnabled(true);
 connConfig.setSendPresence(false);
 connection = new XMPPConnection(connConfig);
 connection.connect();
 connection.login(username, password);
 ServiceDiscoveryManager sdm= ServiceDiscoveryManager.getInstanceFor(connection);

////////////////////////////

    OfflineMessageManager offlineManager = new OfflineMessageManager(  
                    Client.getConnection());  
            try {  
                Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager  
                        .getMessages();  
                System.out.println(offlineManager.supportsFlexibleRetrieval());  
                System.out.println("Number of offline messages:: " + offlineManager.getMessageCount());   
                Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();    
                while (it.hasNext()) {  
                    org.jivesoftware.smack.packet.Message message = it.next();  
                    System.out  
                            .println("receive offline messages, the Received from [" + message.getFrom()  
                                    + "] the message:" + message.getBody());  
                    String fromUser = message.getFrom().split("/")[0];  

                    if(offlineMsgs.containsKey(fromUser))  
                    {  
                        offlineMsgs.get(fromUser).add(message);  
                    }else{  
                        ArrayList<Message> temp = new ArrayList<Message>();  
                        temp.add(message);  
                        offlineMsgs.put(fromUser, temp);  
                    }  
                }  
                / / Deal with a collection of offline messages ...  
                Set<String> keys = offlineMsgs.keySet();  
                Iterator<String> offIt = keys.iterator();  
                while(offIt.hasNext())  
                {  
                    String key = offIt.next();  
                    ArrayList<Message> ms = offlineMsgs.get(key);  
                    TelFrame tel = new TelFrame(key);  
                    ChatFrameThread cft = new ChatFrameThread(key, null);  
                    cft.setTel(tel);  
                    cft.start();  
                    for (int i = 0; i < ms.size(); i++) {  
                        tel.messageReceiveHandler(ms.get(i));  
                    }  
                }  
                offlineManager.deleteMessages();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  

Смотрите это как: http://community.igniterealtime.org

0 голосов
/ 03 апреля 2014

Я столкнулся с той же проблемой при разработке клиента Android с подключенной маской, подключенной к серверу Openfire: я просто не могу получить автономные сообщения. Поэтому, прочитав [XEP-0013]: http://www.xmpp.org/extensions/xep-0013.html, я понял, почему:

"После получения запроса на обнаружение услуги, адресованного узлу" http://jabber.org/protocol/offline" (либо запрос информации о диско #, как в этом случае использования, либо запрос элементов диско #, как в следующем случае использования), сервер НЕ ДОЛЖЕН отправлять поток автономных сообщений, если пользователь впоследствии отправляет первоначальное присутствие на сервер во время этого сеанса. Таким образом, пользователь теперь может свободно отправлять первоначальное присутствие (при желании) и участвовать в обычной IM-активности, продолжая при этом читать офлайн-сообщения. "

Итак, что я изучаю:

  1. Проверьте, поддерживает ли ваш сервер гибкий извлечение сообщений в автономном режиме XEP-0013;
  2. Вы должны инициализировать SmackAndroid.init (Context) - см. ASmack README;
  3. Вы должны использовать AndroidConnectionConfiguration вместо ConnectionConfiguration;
  4. Вы можете настроить вашу конфигурацию на setSendPresence (true), если вам нужно.

Чтобы все работало, вы должны подключиться, отправить первоначальное присутствие как «недоступное», чтобы получить ваши сообщения, затем после этого отправить присутствие как «доступное».

Тогда ваш код должен выглядеть следующим образом (блоки try / catch опущены):

SmackAndroid.init(context);
AndroidConnectionConfiguration connConfig = null;
connConfig = new AndroidConnectionConfiguration(domain, PORT);
connConfig.setSendPresence(true);
connConfig.setReconnectionAllowed(true);
connection = new XMPPConnection(connConfig);
connection.connect();
connection.login("username", "password");

PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
//RECEIVER
connection.addPacketListener(getPacketListener(), filter);
//in order to retrieve offline messages: XEP-0013
connection.sendPacket(new Presence(Presence.Type.unavailable));
connection.sendPacket(new Presence(Presence.Type.available));

Затем после отправки пакета Presence.Type.unavailable все автономные сообщения были отправлены автоматически!

0 голосов
/ 03 мая 2012

Почему вы не просто используете PacketListener, я использую его и получаю автономные сообщения. Вот мой код, я также сохраняю сообщения в Sqlite db, чтобы через некоторое время получать пользовательские сообщения, когда он покидает этот чат и общается с другим другом, а затем отправляетсяназад.

PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
            Main.conn.addPacketListener(new PacketListener() {

                public void processPacket(Packet p) {

                    message = (Message) p;// this was the problem

                    if (message.getBody() != null) {
                        messages.add(message.getBody());
                        Log.i("XMPPClient",
                                "Reciveing text [" + message.getBody() + "] ");

                        time.add(TimeDate());

                        // Add the incoming message to the list view
                        mHandler.post(new Runnable() {
                            public void run() {
                                // / saving convertsations into SQLite db
                                try {

                                    save.open();
                                    save.InsertIntoDatabase(jid, messages, time);
                                    messagesDB = save.GetAllValues(Table_Name,
                                            new String[] { "messages" },
                                            friendJid);
                                    timeDB = save.GetAllValues(Table_Name,
                                            new String[] { "time" }, friendJid);
                                    adapter = new ConversationListAdapter(
                                            getApplicationContext(),
                                            messagesDB, timeDB);
                                    list.setAdapter(adapter);
                                    adapter.notifyDataSetChanged();
                                    save.close();

                                } catch (SQLException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }


                            }
                        });
                    }
                }

            }, filter);
        }
...