2014-03-12 138 views
8

背景:发送和接收IQ XMPP ASMACK的Android

我已经在Android的使用asmack库已经能够实现一对一的聊天,通过XMPP。我也能够向服务器发送状态。我为我的基于聊天的应用程序使用OpenFire服务器。

问题: 我使用connection.addPacketListener(new PacketListener()接收消息和智商的分组,对于消息包我已经把它归类这样

PacketFilter Chatfilter = 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("XMPPClient", "Got text [" + message.getBody() + "] from [" + fromName + "]"); 
       messages.add(fromName + ":"); 
       m1=message.getBody(); 
       messages.add(message.getBody()); 
       // Add the incoming message to the list view 
       /* mHandler.post(new Runnable() { 
       public void run() { 
       setListAdapter(); 
       recieve.setText(m1); 
       } 
       });*/ 
      } 
     } 
}, Chatfilter); 

而且它工作一切正常,但问题出现时我使用类似的东西接收IQ数据包

这里是我用来接收IQ数据包的代码

PacketFilter Iqfilter = new IQTypeFilter(IQ.Type.RESULT); 
connection.addPacketListener(new PacketListener() { 
    public void processPacket(Packet packet) { 
     IQ iq = (IQ) packet; 
     String fromName = StringUtils.parseBareAddress(iq.getFrom()); 
     Log.i("XMPPClient", "Got text [" + iq.toString() + "] from [" + fromName + "]"); 
     m1=iq.getFrom(); 
     mHandler.post(new Runnable() { 
      public void run() { 
       setListAdapter(); 
       recieve.setText(m1); 
      } 
     }); 
    } 
}, Iqfilter); 

我发送一个简单的disco#items查询,它不会响应,即使它不进入功能,我试图调试它,以及,我也试图发送简单PING命令,但它不回应它也是。 我在这里错过了什么?

其次我在将IQ数据包发送到服务器或其他客户端时也遇到了问题。我在某处读到我应该这样做。但它不起作用。

final IQ iq = new IQ() { 
      public String getChildElementXML() { 
      return "<query xmlns='http://jabber.org/protocol/disco#info'/>"; // here is your query 
      //this returns "<iq type='get' from='[email protected]/Resource' id='info1'> <query xmlns='http://jabber.org/protocol/disco#info'/></iq>"; 
      }}; 
      // set the type 
      iq.setType(IQ.Type.GET); 

      // send the request 
      connection.sendPacket(iq); 

混乱的事情是,当我读到XMPP的针对Android有人写了送你需要有接收器的地址以及智商的文档和asmack。但在这个代码中我们没有设置任何接收器。

对于XMPP asmack和Android,互联网上的信息要少得多。

回答

4

我认为问题在于您的提供者没有注册。请看this。在Android上,您必须在形成XMPP连接之前手动注册提供者。下面的类复制到项目

import org.jivesoftware.smack.provider.PrivacyProvider; 
import org.jivesoftware.smack.provider.ProviderManager; 
import org.jivesoftware.smackx.GroupChatInvitation; 
import org.jivesoftware.smackx.PrivateDataManager; 
import org.jivesoftware.smackx.packet.ChatStateExtension; 
import org.jivesoftware.smackx.packet.LastActivity; 
import org.jivesoftware.smackx.packet.OfflineMessageInfo; 
import org.jivesoftware.smackx.packet.OfflineMessageRequest; 
import org.jivesoftware.smackx.packet.SharedGroupsInfo; 
import org.jivesoftware.smackx.provider.AdHocCommandDataProvider; 
import org.jivesoftware.smackx.provider.BytestreamsProvider; 
import org.jivesoftware.smackx.provider.DataFormProvider; 
import org.jivesoftware.smackx.provider.DelayInformationProvider; 
import org.jivesoftware.smackx.provider.DiscoverInfoProvider; 
import org.jivesoftware.smackx.provider.DiscoverItemsProvider; 
import org.jivesoftware.smackx.provider.MUCAdminProvider; 
import org.jivesoftware.smackx.provider.MUCOwnerProvider; 
import org.jivesoftware.smackx.provider.MUCUserProvider; 
import org.jivesoftware.smackx.provider.MessageEventProvider; 
import org.jivesoftware.smackx.provider.MultipleAddressesProvider; 
import org.jivesoftware.smackx.provider.RosterExchangeProvider; 
import org.jivesoftware.smackx.provider.StreamInitiationProvider; 
import org.jivesoftware.smackx.provider.VCardProvider; 
import org.jivesoftware.smackx.provider.XHTMLExtensionProvider; 
import org.jivesoftware.smackx.search.UserSearch; 

import android.util.Log; 

public class ServiceProviders { 
    public static void Register_Providers(ProviderManager pm) { 

     // Private Data Storage 
     pm.addIQProvider("query", "jabber:iq:private", 
       new PrivateDataManager.PrivateDataIQProvider()); 

     // Time 
     try { 
      pm.addIQProvider("query", "jabber:iq:time", 
        Class.forName("org.jivesoftware.smackx.packet.Time")); 
     } catch (ClassNotFoundException e) { 
      Log.w("TestClient", 
        "Can't load class for org.jivesoftware.smackx.packet.Time"); 
     } 

     // Roster Exchange 
     pm.addExtensionProvider("x", "jabber:x:roster", 
       new RosterExchangeProvider()); 

     // Message Events 
     pm.addExtensionProvider("x", "jabber:x:event", 
       new MessageEventProvider()); 

     // Chat State 
     pm.addExtensionProvider("active", 
       "http://jabber.org/protocol/chatstates", 
       new ChatStateExtension.Provider()); 

     pm.addExtensionProvider("composing", 
       "http://jabber.org/protocol/chatstates", 
       new ChatStateExtension.Provider()); 

     pm.addExtensionProvider("paused", 
       "http://jabber.org/protocol/chatstates", 
       new ChatStateExtension.Provider()); 

     pm.addExtensionProvider("inactive", 
       "http://jabber.org/protocol/chatstates", 
       new ChatStateExtension.Provider()); 

     pm.addExtensionProvider("gone", 
       "http://jabber.org/protocol/chatstates", 
       new ChatStateExtension.Provider()); 

     // XHTML 
     pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", 
       new XHTMLExtensionProvider()); 

     // Group Chat Invitations 
     pm.addExtensionProvider("x", "jabber:x:conference", 
       new GroupChatInvitation.Provider()); 

     // Service Discovery # Items 
     pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", 
       new DiscoverItemsProvider()); 

     // Service Discovery # Info 
     pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", 
       new DiscoverInfoProvider()); 

     // Data Forms 
     pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider()); 

     // MUC User 
     pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", 
       new MUCUserProvider()); 

     // MUC Admin 
     pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", 
       new MUCAdminProvider()); 

     // MUC Owner 
     pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", 
       new MUCOwnerProvider()); 

     // Delayed Delivery 
     pm.addExtensionProvider("x", "jabber:x:delay", 
       new DelayInformationProvider()); 

     // Version 
     try { 
      pm.addIQProvider("query", "jabber:iq:version", 
        Class.forName("org.jivesoftware.smackx.packet.Version")); 
     } catch (ClassNotFoundException e) { 
      // Not sure what's happening here. 
     } 

     // VCard 
     pm.addIQProvider("vCard", "vcard-temp", new VCardProvider()); 

     // Offline Message Requests 
     pm.addIQProvider("offline", "http://jabber.org/protocol/offline", 
       new OfflineMessageRequest.Provider()); 

     // Offline Message Indicator 
     pm.addExtensionProvider("offline", 
       "http://jabber.org/protocol/offline", 
       new OfflineMessageInfo.Provider()); 

     // Last Activity 
     pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider()); 

     // User Search 
     pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider()); 

     // SharedGroupsInfo 
     pm.addIQProvider("sharedgroup", 
       "http://www.jivesoftware.org/protocol/sharedgroup", 
       new SharedGroupsInfo.Provider()); 

     // JEP-33: Extended Stanza Addressing 
     pm.addExtensionProvider("addresses", 
       "http://jabber.org/protocol/address", 
       new MultipleAddressesProvider()); 

     // FileTransfer 
     pm.addIQProvider("si", "http://jabber.org/protocol/si", 
       new StreamInitiationProvider()); 

     pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", 
       new BytestreamsProvider()); 

     // Privacy 
     pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider()); 

     pm.addIQProvider("command", "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider()); 
     pm.addExtensionProvider("malformed-action", 
       "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider.MalformedActionError()); 
     pm.addExtensionProvider("bad-locale", 
       "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider.BadLocaleError()); 
     pm.addExtensionProvider("bad-payload", 
       "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider.BadPayloadError()); 
     pm.addExtensionProvider("bad-sessionid", 
       "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider.BadSessionIDError()); 
     pm.addExtensionProvider("session-expired", 
       "http://jabber.org/protocol/commands", 
       new AdHocCommandDataProvider.SessionExpiredError()); 

     pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", 
       new DiscoverInfoProvider()); 
     pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider()); 
     // pm.addExtensionProvider("status ","", new XMLPlayerList()); 

    } 
} 

调用此方法像这样

ServiceProviders.Register_Providers(ProviderManager.getInstance()); 

所以尽量停靠在你的应用程序的开始或形成连接之前调用此方法。

希望这有助于

+0

太好了,现在我得到在一侧的响应,这是惊人的太感谢你了,但是现在我如何能在回信中给服务器。例如,我正在使用xmpp分析器,并向客户端发送迪斯科#项目查询,这是我的客户端收到的,但客户端没有回应服务器。我是否需要添加响应处理程序或类似的东西? –

+0

其次,我怎样才能从客户端发送原始xml查询到服务器。?我是否在代码中丢失了某些内容? –

+0

@HassaanRabbani Nic知道上述解决方案奏效。我没有用asmack xmpp玩过多,我没有使用迪斯科#项目查询的经验。所以我建议你提出另一个问题,以便比我更有经验的人可以指导你。如果上面的答案解决了你的问题,那么请接受它:) –