2011-04-04 162 views
1

我在基於XMPP的通信的Android應用程序中使用Smack。我正在嘗試使用PrivacyManager創建一個隱私列表。我已經成功創建了一個PrivacyList,但是當我嘗試訪問該列表時,它返回ClassCastException。下面是代碼:Smack getPrivacyList方法拋出classCastException

PrivacyListManager privacyManager; 
privacyManager = PrivacyListManager.getInstanceFor(connection); 
PrivacyList privacyList = privacyManager.getPrivacyList("msg_block_list"); 

調查多一點,我已經發現,在調用getRequest方法發生異常在PrivacyListManager.java類上下面的行:

Privacy privacyAnswer = 
      (Privacy) response.nextResult(SmackConfiguration.getPacketReplyTimeout()); 

這裏是調用getRequest方法:

private Privacy getRequest(Privacy requestPrivacy) throws XMPPException { 
     // The request is a get iq type 
     requestPrivacy.setType(Privacy.Type.GET); 
     requestPrivacy.setFrom(this.getUser()); 

     // Filter packets looking for an answer from the server. 
     PacketFilter responseFilter = new PacketIDFilter(requestPrivacy.getPacketID()); 
     PacketCollector response = connection.createPacketCollector(responseFilter); 

     // Send create & join packet. 
     connection.sendPacket(requestPrivacy); 

     // Wait up to a certain number of seconds for a reply. 
     Privacy privacyAnswer = 
      (Privacy) response.nextResult(SmackConfiguration.getPacketReplyTimeout()); 

     // Stop queuing results 
     response.cancel(); 

     // Interprete the result and answer the privacy only if it is valid 
     if (privacyAnswer == null) { 
      throw new XMPPException("No response from server."); 
     } 
     else if (privacyAnswer.getError() != null) { 
      throw new XMPPException(privacyAnswer.getError()); 
     } 
     return privacyAnswer; 
    } 

我跟着this教程實現PrivacyList。任何人都可以幫忙

+0

在什麼庫中包含所有這些類('PrivacyListManager,PrivacyList,Privacy,SmackConfiguration')。 android sdk中沒有這樣的類。你自己定義了嗎? – teoREtik 2011-04-04 05:54:44

+0

我已經爲此導入了Smack API。一切工作正常只有PrivacyList導致問題。 – Adnan 2011-04-04 05:56:22

+0

通過什麼類的響應對象被定義? – teoREtik 2011-04-04 05:57:37

回答

0

我發現了這個問題。 XML文件smack.providers缺失。我創建了具有以下內容的文件,它工作。

<?xml version="1.0"?> 
<!-- Providers file for default Smack extensions --> 
<smackProviders> 
<!-- Privacy --> 
    <iqProvider> 
     <elementName>query</elementName> 
     <namespace>jabber:iq:privacy</namespace> 
     <className>org.jivesoftware.smack.provider.PrivacyProvider</className> 
    </iqProvider>  
</smackProviders> 
+0

你把smack.providers xml文件放在哪裏? – Fahar 2014-03-13 19:45:40

0

PacketCollector'getResult()返回Packet對象,但它可能是從Packet類對象中的任何繼承,無論是MessagePresenceIQ S分析(在IQ情況下,你可以使用(privacy)投,因爲PrivacyIQ的子類)。在你的情況下,你似乎得到了另一個層次結構中存在的對象,而不是Privacy類。

+0

是的,你是對的,它返回一個PacketParserUtils類的對象,但它的API職責返回正確的類。如何解決它? – Adnan 2011-04-04 06:58:40

+0

如果您有可能,請嘗試查看PacketCollector.java源代碼並自定義它。我可以假設PacketParserUtils需要XMLPullParser來生成數據包,因此有下一個決定:1)您可以根據需要編輯PacketParserUtils.java。 2)你可以包含你的項目org.xmlpull.v1.XmlPullParser包,並將它與PacketParcelUtils綁定。 – teoREtik 2011-04-04 07:14:50

+0

我發現PacketParserUtil nerver解析jabber:iq:privacy stanzas。 – Adnan 2011-04-04 09:37:04

相關問題