Smack метод getPrivacyList генерирует исключение classCastException

1

Я использую 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. Кто может помочь?

  • 0
    В какой библиотеке PrivacyListManager, PrivacyList, Privacy, SmackConfiguration все эти классы ( PrivacyListManager, PrivacyList, Privacy, SmackConfiguration ). В Android SDK таких классов нет. Вы сами это определили?
  • 0
    Я импортировал Smack API для этого. Все остальное работает нормально, только PrivacyList вызывает проблемы.
Показать ещё 4 комментария
Теги:
smack

2 ответа

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

PacketCollector метод getResult() возвращает объект Packet, но он может быть любым наследуемым от объекта класса Packet, либо Message, либо Presence или IQIQ случае, которое вы можете использовать (privacy), потому что Privacy - это IQ дочерний класс). В вашем случае кажется, что вы получаете объект, который присутствует в другой иерархии, чем класс Privacy.

  • 0
    Да, вы правы, он возвращает объект класса PacketParserUtils, но ответственность за возвращение правильного класса лежит на API. Как это исправить?
  • 0
    Если у вас есть такая возможность, попробуйте взглянуть на исходный код PacketCollector.java и настроить его под себя. Я просто могу предположить, что PacketParserUtils нужен XMLPullParser для генерации Packet, поэтому есть следующие решения: 1) Вы можете отредактировать PacketParserUtils.java для своих нужд. 2) Вы можете включить в свой проект пакет org.xmlpull.v1.XmlPullParser и связать его с PacketParcelUtils.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню