I am unable to transfer file using a smack, I am using android emulator on one side and spark on the other. When I do transfer the application force closes with the following error messages and a notification of file transfer request, after accepting the file, there was an error transfering the file.error log is pasted below.
I searched dif开发者_开发问答ferent solution and one of them says:
First, you have to copy a smack.properties to you android emulator. You can get smack.properties at the original SMACK API site.
http://www.igniterealtime.org/downloads/source.jsp
I opened the site and downloaded the source code of smack but unable to find smack.properties
anywhere.
1st choice closed.
Second solution proposed was to change the implementation of discoverLocalIP()
in org.jivesoftware.smackx.filetransfer.Socks5TransferNegotiator.discoverLocalIP()
which I am unable to find.
How can i transfer file?
WARN/dalvikvm(4994): threadid=25: thread exiting with uncaught exception (group=0x4001b188)
ERROR/AndroidRuntime(4994): Uncaught handler: thread File Transfer jsi_8875615847496033183 exiting due to uncaught exception
ERROR/AndroidRuntime(4994): java.lang.ClassCastException: org.jivesoftware.smack.util.PacketParserUtils$2
ERROR/AndroidRuntime(4994): at org.jivesoftware.smackx.filetransfer.FileTransferNegotiator.negotiateOutgoingTransfer(FileTransferNegotiator.java:401)
ERROR/AndroidRuntime(4994): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer.negotiateStream(OutgoingFileTransfer.java:359)
ERROR/AndroidRuntime(4994): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer.access$100(OutgoingFileTransfer.java:35)
ERROR/AndroidRuntime(4994): at org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer$2.run(OutgoingFileTransfer.java:214)
ERROR/AndroidRuntime(4994): at java.lang.Thread.run(Thread.java:1096)
@hunt Create the following function to configure provider mager and call it before the file is sent.
public void configureProviderManager() {
ProviderManager pm = ProviderManager.getInstance();
// The order is the same as in the smack.providers file
// Private Data Storage
pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
// Time
try {
pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
} catch (ClassNotFoundException e) {
System.err.println("Can't load class for org.jivesoftware.smackx.packet.Time");
}
// Roster Exchange
pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider());
// Message Events
pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider());
// Chat State
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());
// XHTML
pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());
// Group Chat Invitations
pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider());
// Service Discovery # Items
pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
// Service Discovery # Info
pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
// Data Forms
pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());
// MUC User
pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider());
// MUC Admin
pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
// MUC Owner
pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
// Delayed Delivery
pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider());
pm.addExtensionProvider("delay", "urn:xmpp:delay", new DelayInformationProvider());
// Version
try {
pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
} catch (ClassNotFoundException e) {
System.err.println("Can't load class for org.jivesoftware.smackx.packet.Version");
}
// VCard
pm.addIQProvider("vCard","vcard-temp", new VCardProvider());
// Offline Message Requests
pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());
// Offline Message Indicator
pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
// Last Activity
pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider());
// User Search
pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider());
// SharedGroupsInfo
pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());
// JEP-33: Extended Stanza Addressing
pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider());
// FileTransfer
pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider());
pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
pm.addIQProvider("open","http://jabber.org/protocol/ibb", new OpenIQProvider());
pm.addIQProvider("data","http://jabber.org/protocol/ibb", new DataPacketProvider());
pm.addIQProvider("close","http://jabber.org/protocol/ibb", new CloseIQProvider());
pm.addExtensionProvider("data","http://jabber.org/protocol/ibb", new DataPacketProvider());
// Privacy
pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider());
// SHIM
pm.addExtensionProvider("headers", "http://jabber.org/protocol/shim", new HeadersProvider());
pm.addExtensionProvider("header", "http://jabber.org/protocol/shim", new HeaderProvider());
// PubSub
pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub", new PubSubProvider());
pm.addExtensionProvider("create", "http://jabber.org/protocol/pubsub", new SimpleNodeProvider());
pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider());
pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub", new ItemProvider());
pm.addExtensionProvider("subscriptions", "http://jabber.org/protocol/pubsub", new SubscriptionsProvider());
pm.addExtensionProvider("subscription", "http://jabber.org/protocol/pubsub", new SubscriptionProvider());
pm.addExtensionProvider("affiliations", "http://jabber.org/protocol/pubsub", new AffiliationsProvider());
pm.addExtensionProvider("affiliation", "http://jabber.org/protocol/pubsub", new AffiliationProvider());
pm.addExtensionProvider("options", "http://jabber.org/protocol/pubsub", new FormNodeProvider());
// PubSub owner
pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub#owner", new PubSubProvider());
pm.addExtensionProvider("configure", "http://jabber.org/protocol/pubsub#owner", new FormNodeProvider());
pm.addExtensionProvider("default", "http://jabber.org/protocol/pubsub#owner", new FormNodeProvider());
// PubSub event
pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", new EventProvider());
pm.addExtensionProvider("configuration", "http://jabber.org/protocol/pubsub#event", new ConfigEventProvider());
pm.addExtensionProvider("delete", "http://jabber.org/protocol/pubsub#event", new SimpleNodeProvider());
pm.addExtensionProvider("options", "http://jabber.org/protocol/pubsub#event", new FormNodeProvider());
pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub#event", new ItemsProvider());
pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub#event", new ItemProvider());
pm.addExtensionProvider("retract", "http://jabber.org/protocol/pubsub#event", new RetractEventProvider());
pm.addExtensionProvider("purge", "http://jabber.org/protocol/pubsub#event", new SimpleNodeProvider());
// Nick Exchange
pm.addExtensionProvider("nick", "http://jabber.org/protocol/nick", new Nick.Provider());
// Attention
pm.addExtensionProvider("attention", "urn:xmpp:attention:0", new AttentionExtension.Provider());
}
The config files are under
resources/META-INF/
The ones you will need are
smack-config.xml
smack.providers
Your specific error is caused by the fact that the ProviderManager has not been configured with the smack.providers file. This results in the incoming packets being read into the default PacketExtension instead of the one configured for the specific stanza type.
If you are using asmack, I would think that would be handled already. If regular Smack, you will have to configure the ProviderManager to read the file from the right location.
I think you can do this by extending ProviderManager and overriding the initialize() method. Basically copy the existing one but specify the android resource directory instead of the META-INF one. There is already a Jira task against this to make the directory configurable, but it isn't resolved yet.
In addition, there was a bug in file transfer that was fixed in the latest version (3.2.1).
精彩评论