开发者

Smack getPrivacyList method throws classCastException

I am using Smack in an Android app for XMPP based communication. I am trying to create a privacy list using PrivacyManager. I have created a PrivacyList successfully, but when I try to access that list it returns ClassCastException. Here is the code:

PrivacyListManager privacyManager;
privacyManager = Priva开发者_如何学编程cyListManager.getInstanceFor(connection);
PrivacyList privacyList = privacyManager.getPrivacyList("msg_block_list");

Investigating a bit more, I have found that the exception occurs in getRequest method in PrivacyListManager.java class on following line:

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

Here is the getRequest method:

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;
    }

I have followed this tutorial for implementing PrivacyList. Anyone can help?


PacketCollector's method getResult() returns Packet object, but it could be any inherited from Packet class object, either Message or Presence or IQ (in IQ case you can use (privacy) cast, because Privacy is IQ's child class). In your case it seems like you get object which is present in another hierarchy, than Privacy class.


I have found the problem. The XML file smack.providers was missing. I created the file with following contents and it worked.

<?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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜