2013-03-20 1 views
3

После нескольких часов отладки и попытки выяснить, почему передача файлов не работала с использованием 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

ответ

0

Используйте Iterator<Presence> Roster.getPresences(String user), чтобы получить информацию о присутствии от всех известных ресурсов пользователя. Для этих экземпляров присутствия getFrom() должен вернуть полный JID, который вы можете использовать в FileTransferManager.createOutgoingFileTransfer().

Я создал SMACK-430, касающийся использования полного JID в createOutgoingFileTranfer(). Это действительно должно вызвать исключение, чтобы пользователи smack не должны были отлаживать часы, чтобы найти причину (хотя это указано в методе javadoc). SMACK-430 также объясняет, почему FileTransferManager нуждается в полном JID и не может использоваться с открытым JID.

+0

My bad. Я думал, что где-то упоминал, что я использую asmack, но, похоже, я этого не делал. Roster.getPresences - это недоступный метод, который кажется :( – Gabriel

+0

Ах, нет, я нашел его в connection.getRoster(). Я пробовал, как вы сказали, но я все еще получаю чистый JID. Пожалуйста, проверьте мой вопрос выше, Я отредактировал его. – Gabriel

+0

Вы должны обновить версию aSmack, если используете старый. ASmack определенно имеет 'Roster.getPresences()'. – Flow