Reputation: 2621
I am using Smack and Openfire server for a chat client, all things working well like chat, sending an invitation for a new addition of user, getting list of available users etc. I encountered an error of ClassCastException when I try to send a file from a android client to another user using below code it gives me stack of error.
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());
}
When I try to send the file, it shows up at the other end's spark however when clicked on "Accept", does not start the file transfer, instead it shows "Error in transfering file".
In Error log it shows me the below error:
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.: I am using Smack Library.
Upvotes: 0
Views: 1219
Reputation: 2621
Add the following method to your class.
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());
}
And just before connect function is called. call the method with like this.
configure(ProviderManager.getInstance());
Upvotes: 1