После нескольких часов отладки и попытки выяснить, почему передача файлов не работала с использованием aSmack, в то время как нормальный обмен сообщениями, я, наконец, смог привязать его к этому.Файл Smack's FileTransferManager.createOutgoingFileTransfer принимает только полные JID. Как я могу определить полный JID пользователя в Smack?
Сервер Openfire отправляет JID реестров, отсутствующий в конце, когда я следую методу, указанному в документации Smack, чтобы получить список реестров пользователей.
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry r : entries) {
Log.v("Gabriel","Receiving: " + r.getUser());
}
Например, если я получаю сообщение от пользователя Гавриила, я получаю «С», как:
[email protected]/Smack
Но r.getUser() возвращает пользователю как
[email protected]
Даже
connection.getRoster().getPresence(contactName).getFrom()
возвращается как «габриэль @ драгонов».
Это приводит к сбою передачи файлов, но, как ни странно, это не обычный обмен сообщениями. Однако когда я вручную добавляю/Smack в конце
OutgoingFileTransfer transferr = manager.createOutgoingFileTransfer(contactJID+"/Smack");
это работает.
Вопрос в том, как я могу получить полный JID с включенной частью ресурса или сконфигурировать передачу файлов, чтобы она не сработала при использовании голого JID?
Edit:
Я попробовал следующий метод:
Log.v("Gabriel", entries.size() + " buddy(ies):");
for (RosterEntry r : entries) {
Log.v("Pat","adding: " + r.getType() + " " + r.getName());
contacts.add(r.getUser());
}
for (String contact : contacts){
Iterator<org.jivesoftware.smack.packet.Presence> presences = connection.getRoster().getPresences(contact);
Log.v("Gabriel", contact+" has: ");
while(presences.hasNext()){
Log.v("Gabriel",presences.next().getFrom());
}
}
Но я все еще получаю голую ID.
Выход: Габриэля @ dragonov имеет: Gabriël @ dragonov
My bad. Я думал, что где-то упоминал, что я использую asmack, но, похоже, я этого не делал. Roster.getPresences - это недоступный метод, который кажется :( – Gabriel
Ах, нет, я нашел его в connection.getRoster(). Я пробовал, как вы сказали, но я все еще получаю чистый JID. Пожалуйста, проверьте мой вопрос выше, Я отредактировал его. – Gabriel
Вы должны обновить версию aSmack, если используете старый. ASmack определенно имеет 'Roster.getPresences()'. – Flow