Не могу получить автономные сообщения с помощью asmack api для приложения Gtalk

Я создаю приложение чата для 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)

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


person mayank_droid    schedule 16.03.2012    source источник
comment
Эй, ты нашел решение? Я получаю такое же исключение.   -  person Lalit Poptani    schedule 21.04.2012
comment
нет. :( Все еще ищу решение. Скажи мне, если найдешь.!!   -  person mayank_droid    schedule 21.04.2012
comment
stackoverflow.com/questions/7454995/ я получил это   -  person Lalit Poptani    schedule 21.04.2012
comment
дорогой, не работает, см. logcat, это какая-то странная ошибка, думаю, что-то не так с услугами gtalk или разрешениями.   -  person mayank_droid    schedule 28.05.2012
comment
Что ж, я пробовал, и у меня это сработало, просто настройте прослушиватель для получения сообщений, и он будет захватывать автономные сообщения.   -  person Lalit Poptani    schedule 28.05.2012
comment
@LalitPoptani Я установил тот же прослушиватель, который вы указали, но я не могу получать автономные сообщения. Я получаю сообщения только тогда, когда я онлайн. Не могли бы вы сказать мне   -  person Gaurav Arora    schedule 02.11.2012


Ответы (3)


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

 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/message/199005#199005

person ρяσѕρєя K    schedule 22.03.2012
comment
поскольку другого ответа нет, и ваш ответ кажется почти правильным, у меня просто проблемы с сервисами Google, но не с asmack api. Я должен оценить ваш ответ. - person mayank_droid; 27.03.2012
comment
@imran khan, какой лучший API для клиента xmpp должен поддерживать чаты как facebook, так и gtalk. если я использую asmack-issue5, сталкиваюсь с проблемой для gtalk и smack, сталкиваюсь с проблемой для gtalk (получение списка друзей).. - person RajaReddy PolamReddy; 27.07.2012
comment
Спасибо, но зачем нам отправлять присутствие как ложное. это означает, что я в автономном режиме (мой доступный статус на сервере отключен). но нам нужно получать автономные сообщения только тогда, когда я в сети, верно? это означает, что я должен получить автономные сообщения в следующем сеансе входа в систему. для этого что мне делать?? @pρяσѕρєя К - person Roster; 16.08.2013
comment
@prospec, можете ли вы рассказать мне о Client.getconnection ?? новый OfflineMessageManager( Client.getConnection()); Client.getConnection() не может найти клиента? - person CoronaPintu; 18.05.2015
comment
Это отлично работает... моя проблема была с настройкой connConfig.setSendPresence(true); - person mut tony; 02.07.2020

Почему бы вам просто не использовать 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);
        }
person Weloo    schedule 03.05.2012
comment
Спасибо за это:). Но я ищу автономные сообщения, которые я не получаю при запуске приложения, должно быть что-то, из чего я мог бы получить автономные сообщения, я уже пытался получить их с помощью этого метода, но ничего не работает. Если вы знаете, как получать автономные сообщения, пожалуйста, помогите мне. - person mayank_droid; 03.05.2012
comment
@mak_just4anything Привет, ты нашел решение :( Я все еще ищу :( - person Gaurav Arora; 04.11.2012

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

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

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

  1. Проверьте, поддерживает ли ваш сервер гибкое извлечение сообщений в автономном режиме XEP-0013;
  2. Вы должны инициализировать SmackAndroid.init(Context) — см. Smack 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 все автономные сообщения отправлялись автоматически!

person Rafael_Stirling    schedule 03.04.2014