2014-07-25 1 views
0

Я использую сервер Smack и Openfire для клиента чата, все работает хорошо, как чат, отправка приглашение на новое добавление пользователя, получение списка доступных пользователей и т. д. Я столкнулся с ошибкой ClassCastException, когда я пытаюсь отправить файл от клиента android другому пользователю, используя приведенный ниже код, который дает мне стек ошибок.

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); 
if (sdm == null) 
sdm = new ServiceDiscoveryManager(connection); 
sdm.addFeature("http://jabber.org/protocol/disco#info"); 
sdm.addFeature("jabber:iq:privacy"); 
fileTransfer(fileName, recepient.getText().toString() + "/Spark 2.6.3"); 

public void fileTransfer(String fileName, String destination) throws XMPPException { 

     FileTransferNegotiator.setServiceEnabled(connection,true); 
     OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(destination); 
     transfer.sendFile(new File(fileName), "You won't believe this!"); 
     try { 
      Thread.sleep(10000); 
     } 
     catch(Exception e){ 
      Toast.makeText(getActivity(), "Exception " + e, Toast.LENGTH_LONG).show(); 
     } 
     System.out.println("Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException()); 
     System.out.println("Is it done? " + transfer.isDone()); 
     Toast.makeText(getActivity(), "Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException(), Toast.LENGTH_LONG).show(); 
     Log.v("ONMESSAGE", "Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException()); 
    } 

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

В журнал ошибок, он показывает мне ошибку ниже:

07-25 12:08:22.393: E/AndroidRuntime(27708): java.lang.ClassCastException: org.jivesoftware.smack.PacketReader$4 cannot be cast to org.jivesoftware.smackx.packet.StreamInitiation 
07-25 12:08:22.393: E/AndroidRuntime(27708): at org.jivesoftware.smackx.filetransfer.FileTransferNegotiator.negotiateOutgoingTransfer(FileTransferNegotiator.java:401) 
07-25 12:08:22.393: E/AndroidRuntime(27708): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer.negotiateStream(OutgoingFileTransfer.java:300) 
07-25 12:08:22.393: E/AndroidRuntime(27708): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer.access$100(OutgoingFileTransfer.java:35) 
07-25 12:08:22.393: E/AndroidRuntime(27708): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer$2.run(OutgoingFileTransfer.java:214) 
07-25 12:08:22.393: E/AndroidRuntime(27708): at java.lang.Thread.run(Thread.java:838) 

N.B .: Я использую Смак Library.

+0

Почему вы спите? – alicanbatur

+0

неважно, что я нашел ответ. Фактически, где-то я читал этот поток раньше, просто исследовал его и нашел ответ. Я отправляю ответ ниже. – Saty

ответ

0

Добавьте следующий класс в свой класс.

public void configure(ProviderManager pm) { 

    pm.addIQProvider("query", "jabber:iq:private", 

      new PrivateDataManager.PrivateDataIQProvider()); 

    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"); 

    } 
    pm.addExtensionProvider("x", "jabber:x:roster", 

      new RosterExchangeProvider()); 
    pm.addExtensionProvider("x", "jabber:x:event", 

      new MessageEventProvider()); 
    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()); 
    pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", 

      new XHTMLExtensionProvider()); 

    pm.addExtensionProvider("x", "jabber:x:conference", 

      new GroupChatInvitation.Provider()); 
    pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", 
      new DiscoverItemsProvider()); 

    pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", 

      new DiscoverInfoProvider()); 
    pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider()); 
    pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", 
      new MUCUserProvider()); 
    pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", 
      new MUCAdminProvider()); 

    pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", 
      new MUCOwnerProvider()); 
    pm.addExtensionProvider("x", "jabber:x:delay", 
      new DelayInformationProvider()); 
    try { 

     pm.addIQProvider("query", "jabber:iq:version", 

       Class.forName("org.jivesoftware.smackx.packet.Version")); 

    } catch (ClassNotFoundException e) { 

     // Not sure what's happening here. 

    } 
    pm.addIQProvider("vCard", "vcard-temp", new VCardProvider()); 
    pm.addIQProvider("offline", "http://jabber.org/protocol/offline", 

      new OfflineMessageRequest.Provider()); 
    pm.addExtensionProvider("offline","http://jabber.org/protocol/offline",new OfflineMessageInfo.Provider()); 
    pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider()); 
    pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider()); 
    pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup",new SharedGroupsInfo.Provider()); 
    pm.addExtensionProvider("addresses","http://jabber.org/protocol/address",new MultipleAddressesProvider()); 
    pm.addIQProvider("si", "http://jabber.org/protocol/si",new StreamInitiationProvider()); 
    pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", 
      new BytestreamsProvider()); 
    pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider()); 

} 

И как раз перед вызовом функции connect. вызовите метод следующим образом.

configure(ProviderManager.getInstance()); 

Это, безусловно, поможет решить проблему. Спасибо вам всем.

+1

Ручная настройка ProviderManager не требуется с использованием последних версий (a) Smack. Это признак того, что вы либо используете старую версию aSmack, либо не выполняете инструкции в README, если вам это нужно. – Flow

+0

@Flow Возможно, это так ... это тоже полезная информация для этого сообщения .... Фактически год назад я сделал этот клиент без передачи файлов, и теперь я хочу настроить его для передачи файлов, поэтому не сможет перейти к последней библиотеке .... Я тоже это изменю ... Спасибо за эту ценную информацию – Saty