getSearchForm возвращает значение null при использовании UserSearch в XMPP с помощью aSmack

У меня есть этот код, почти не измененный из примеров:

                UserSearchManager usm = new UserSearchManager(conn);
                Form searchForm = usm.getSearchForm("search.myserver.com");
                Form answerForm = searchForm.createAnswerForm();
                answerForm.setAnswer("Username", true);
                answerForm.setAnswer("search", contact.getJid());
                ReportedData data = usm.getSearchResults(answerForm, "search.myserver.com");

Это отлично работает в среде рабочего стола с использованием библиотеки Smack, но я не могу заставить ее работать в Android (где мне приходится использовать asmack).

Проблема в том, что searchForm имеет значение null, потому что getSearchForm возвращает значение null. Это кажется довольно странным, поскольку я не могу найти никакой документации, в каких случаях этот метод должен возвращать значение null.

Сервер Openfire, если это поможет.


person Nacho L.    schedule 06.05.2011    source источник


Ответы (3)


Обновление от апреля 2014 г.

Исходный ответ ниже содержит старую и устаревшую информацию. Начиная с версии aSmack 0.8 больше нет необходимости вручную настраивать диспетчер провайдеров. Вызов SmackAndroid.init(Context), как указано в файле aSmack README, позаботится обо всех необходимых инициализациях.

Исходный ответ

В конце концов, проблема была глобальная для всех asmack. Кажется, это известная проблема: файл smack.providers, обычно находящийся в папке /META-INF в обычных версиях smack, не может быть загружен в Android из-за упаковки jar. Таким образом, все провайдеры должны быть инициализированы вручную, как показано в ответе Майка Райана в этой ветке: http://community.igniterealtime.org/message/201866#201866

Я удалил то, что мне не подошло, и вот результат.

public void configure(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());

}

Я прокомментировал всего пару строк, и вуаля. Это должно быть вызвано перед созданием экземпляра XMPPConnection с такой строкой:

    configure(ProviderManager.getInstance());

Теперь мне придется заняться другими своими проблемами, но, по крайней мере, эта решена :)

person Nacho L.    schedule 13.05.2011

В примере кода XmppTool.java getSearchFrom используется в searchUsers().

public List<User> searchUsers(String serverDomain,String userName){
        List<User> list = new ArrayList<User>();
        UserSearchManager userSearchManager = new UserSearchManager(con);
        try {
            Form searchForm = userSearchManager.getSearchForm("search."+serverDomain);
            Form answerForm = searchForm.createAnswerForm();
            answerForm.setAnswer("Username", true);
            answerForm.setAnswer("Name", true);
            answerForm.setAnswer("search", userName);
            ReportedData data = userSearchManager.getSearchResults(answerForm, "search."+serverDomain);
            Iterator<Row> rows = data.getRows();
            while(rows.hasNext()){
                User user = new User();
                Row row = rows.next();
                user.setUserName(row.getValues("Username").next().toString());
                user.setName(row.getValues("Name").next().toString());
                SLog.i(tag, user.toString());
                list.add(user);
            }
        } catch (XMPPException e) {
            SLog.e(tag, Log.getStackTraceString(e));
        }
        return list;
    }

Вы можете обратиться к глобальным настройкам в java-файле, чтобы исправить свой код.

person Lemontree    schedule 28.06.2018

Javadoc UserSearchManager объясняет следующее:

UserSearchManager — это фасад, созданный на основе служб поиска Jabber (JEP-055), позволяющий выполнять поиск в репозиториях на сервере Jabber. Эта реализация обеспечивает прозрачность реализации поиска (DataForms или No DataForms), но позволяет пользователю просто использовать модель DataForm для поддержки обоих типов.

 XMPPConnection con = new XMPPConnection("jabber.org");
 con.login("john", "doe");
 UserSearchManager search = new UserSearchManager(con, "users.jabber.org");
 Form searchForm = search.getSearchForm();
 Form answerForm = searchForm.createAnswerForm();
 answerForm.setAnswer("last", "DeMoro");
 ReportedData data = search.getSearchResults(answerForm);
 // Use Returned Data
person Z. Mei    schedule 29.06.2018