aSmack File Transfer возвращает NPE

я разрабатываю приложение для чата, в FileTransfers я могу успешно отправить файл клиенту искры, но при прослушивании я получаю ошибку NullPointerException в части переговоров, вот IQ, полученный клиентом Android от искры:

 RCV (0): <iq id="dnkUY-33" to="reza@reza-hp/Smack" from="admin@reza-hp/Spark 2.6.3"  
 type="set">
 <si xmlns="http://jabber.org/protocol/si" id="jsi_5267323957851897853" 
 mime-type="image/jpeg" profile="http://jabber.org/protocol/si/profile/file-
 transfer">
 <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" 
 name="635px-Food.jpg" size="45135">
 <desc>Sending file</desc>
 </file><feature 
 xmlns="http://jabber.org/protocol/feature-neg"><x xmlns="jabber:x:data" type="form">
 <field var="stream-method" type="list-single">
  <option><value>http://jabber.org/protocol/bytestreams</value></option><option>   
  <value>http://jabber.org/protocol/ibb</value></option></field></x></feature> 
  </si></iq>

и вот ошибка Printed:

   07-01 13:40:49.075: W/System.err(1986): java.lang.NullPointerException
   07-01 13:40:49.075: W/System.err(1986):  
   atorg.jivesoftware.smackx.filetransfer.
   IncomingFileTransfer.negotiateStream(IncomingFileTransfer.java:173)
   07-01 13:40:49.075: W/System.err(1986):  at  
   org.jivesoftware.smackx.filetransfer.
   IncomingFileTransfer.access$100(IncomingFileTransfer.java:45)
   07-01 13:40:49.075: W/System.err(1986):  at  
   org.jivesoftware.smackx.filetransfer.
   IncomingFileTransfer$1.run(IncomingFileTransfer.java:122)
   07-01 13:40:49.085: W/System.err(1986):  at java.lang.Thread.run(Thread.java:841)

Исключение равно null, но, согласно предоставленному IQ, кажется, что тип передачи - это «инициация потока», поэтому я подумал, что, возможно, asmack не обнаруживает его по умолчанию, есть ли у кого-нибудь какое-либо решение для этого или знает, как обнаружить " Инициация потока" ? заранее большое спасибо ‹3 о, и я использую сервер OpenFire :)


person user3788661    schedule 01.07.2014    source источник
comment
ОООккк, только что нашел решение, я был прав в отношении проблемы, извините за слабую ИТ-службу aSmack, просто добавьте это поле: ServiceDiscoveryManager.getInstanceFor(connection).addFeature(jabber.org/protocol /si); так что ваш aSmack поддерживает StreamInitiation.... я уверен, что это решает много проблем людей   -  person user3788661    schedule 01.07.2014
comment
также в некоторых случаях вам может понадобиться добавить это на отправляющую сторону: FileTransferNegotiator.setServiceEnabled(connection, true); или/и: FileTransferNegotiator.IBB_ONLY=true; // обратите внимание, что это приводит к использованию только протокола IBB, но иногда нет выбора в зависимости от клиента, сервера и т. д. из-за известных ошибок asmack k   -  person user3788661    schedule 01.07.2014
comment
просто добавьте это поле: ServiceDiscoveryManager.getInstanceFor(connection).addFeature(jabber.org/protocol/si); Это делается автоматически с помощью aSmack. Также известны баги aSmack, связанные с передачей файлов. Какую версию вы используете?   -  person Flow    schedule 02.07.2014
comment
последняя версия 8-4.0.0, явно нет   -  person user3788661    schedule 02.07.2014
comment
и чувак, поддерживает ли openfire автономную передачу файлов?   -  person user3788661    schedule 02.07.2014
comment
Пространство имен 'jabber.org/protocol/si' добавляется к функциям соединений после запуска FileTransferManager. : FileTransferManager() вызывает FileTransferNegotiator.getInstanceFor(), который вызывает FileTransferNegotiator.setServiceEnabled(), который добавляет функцию в ServiceDiscoveryManager.   -  person Flow    schedule 02.07.2014
comment
я также добавил это, все еще не работало, пока я не сделал, как я сказал   -  person user3788661    schedule 02.07.2014


Ответы (1)


ОООккк, только что нашел решение, я был прав в отношении проблемы, извините за слабую ИТ-систему aSmack, просто добавьте это поле:

 ServiceDiscoveryManager.getInstanceFor(connection).addFeature("jabber.org/protocol  
 /si"); 

так что ваш aSmack поддерживает StreamInitiation.... я уверен, что это решает много проблем людей

также добавьте провайдеров передачи файлов ПОСЛЕ подключения, это имеет значение. и под этим я подразумеваю, когда вы уверены, что они прочитаны, когда соединение уже подключено, например, «попробуйте»

и самая важная часть: обязательно используйте Asmack 8-4.0.0 rc-1, лучше всего подходит для передачи файлов, любые вопросы будут рады помочь, после 1 недели попыток я думаю, что многому научился. Благодарность

person user3788661    schedule 02.07.2014
comment
Я настоятельно рекомендую не использовать релиз-кандидат (4.0.0-rc1) aSmack, когда доступен релиз (4.0.0). Нет причин использовать -rc1. - person Flow; 03.07.2014
comment
чувак, ты нашел какое-нибудь абсолютное решение для передачи файлов asmack? - person user3788661; 03.07.2014
comment
У меня нет проблем с aSmack filetransfer, он у меня работает и поэтому я не ищу решения. - person Flow; 03.07.2014
comment
Хорошо, не могли бы вы мне немного помочь, насколько я знаю, в коде нет проблем, вы тестировали его с эмулятором и сервером openfire? - person user3788661; 03.07.2014
comment
потому что с одним и тем же кодом мой код иногда работает, а затем не работает после перезапуска приложения! - person user3788661; 03.07.2014
comment
если у кого-нибудь есть решение, пожалуйста, может мне помочь, мое приложение для чата с сервером ejabberd и между клиентами Android работает правильно, но когда я отправляю любой файл, чем ход отправки, зависает на 0.0 ... в чем может быть причина? - person Devang; 09.09.2014