Я использую Smack в Android-приложении для связи на основе XMPP. Я пытаюсь создать список конфиденциальности с помощью PrivacyManager. Я создал PrivacyList успешно, но когда я пытаюсь получить доступ к этому списку, он возвращает 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;
}
Я последовал за этим руководством по внедрению PrivacyList. Кто может помочь?
Я нашел проблему. Файл 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>
PacketCollector
метод getResult()
возвращает объект Packet
, но он может быть любым наследуемым от объекта класса Packet
, либо Message
, либо Presence
или IQ
(в IQ
случае, которое вы можете использовать (privacy)
, потому что Privacy
- это IQ
дочерний класс). В вашем случае кажется, что вы получаете объект, который присутствует в другой иерархии, чем класс Privacy
.
PrivacyListManager, PrivacyList, Privacy, SmackConfiguration
все эти классы (PrivacyListManager, PrivacyList, Privacy, SmackConfiguration
). В Android SDK таких классов нет. Вы сами это определили?