Search code examples
androidsmack

File transfer using smack in android apps.


This error come in log.

from='kutbi1@360degree/Smack' to='akash@360degree/Smack' type='error' id='hK1L6-5'>
<si xmlns='http://jabber.org/protocol/si' id='jsi_191216212994140179' mime-type='image/png' profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='this_old_house.png' size='12623'>
<desc>You won&apos;t believe this!</desc></file>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-multi'>
 <option><value>http://jabber.org/protocol/bytestreams</value></option>
 <option><value>http://jabber.org/protocol/ibb</value></option>
</field>
 </x>
</feature>
</si>
<error code='503' type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error></iq>

I have use following code here

    ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(Main.connection);
    if (sdm == null)
        sdm = new ServiceDiscoveryManager(Main.connection);
    sdm.addFeature("http://jabber.org/protocol/disco#info");
    sdm.addFeature("jabber:iq:privacy");

   FileTransferNegotiator.setServiceEnabled(Main.connection, true);
   FileTransferManager manager = new FileTransferManager(Main.connection);
  OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(id
           + "/Smack");

   Log.i("transfere file", "outgoingfiletransfere is created");
    try{
        //OutgoingFileTransfer.setResponseTimeout(60000);
        transfer.sendFile(new File(txt_file.getText().toString()), "You won't believe this!");

        if (transfer.getStatus().equals(Status.cancelled)
                || transfer.getStatus().equals(Status.refused)) {
                Log.d("Cancel", ""+transfer.getError());
                System.out.println("Cancelled!!! " + transfer.getError());
            }

        Log.i("transfere file", "sending file");
        Log.d("FTTRY", "m in ft TRY");
        btn_transfer.setText("Browse");
        txt_file.setText("click on browse n Select File");
        send_flag = true;
    }catch (Exception e) {
        Log.d("FTCATCH", "m in ft catch");
        btn_transfer.setText("BrowseC");
        send_flag = true;
    }

    while(!transfer.isDone()) {
        try{
           Thread.sleep(1000);
        }catch (Exception e) {
        }
          Log.i("transfere file", "sending file status "
                      + transfer.getStatus() + "progress: "
                      + transfer.getProgress());
       if(transfer.getStatus().equals(Status.error)) {
             System.out.println("ERROR!!! " + transfer.getError());
       } else {
             System.out.println(transfer.getStatus());
             System.out.println(transfer.getProgress());
             Log.d("PROG", "m in ft progress");
       }
      try{
       Thread.sleep(1000);
      }catch (Exception e) {
    }
 }

Solution

  • I solved the same issue by doing this following procedure.

    I am using asmack-2010.05.07-source in eclipse for android-2.2.

    Go for ProviderManager class in the asmack. Replace the following code

    Enumeration providerEnum = classLoader.getResources(
                            "/META-INF/smack.providers");
    

    with this

    Enumeration providerEnum = classLoader.getResources(
                            "/data/smack.providers");
    

    After this you need to do a patch. Add the following function before you creating the new XMPPConnection. You can call this function by

     configure(ProviderManager.getInstance());
    

    This is the method.

    public void configure(ProviderManager pm) {
    
        //  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) {
            Log.w("TestClient", "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());
    
        //  Version
        try {
            pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
        } catch (ClassNotFoundException e) {
            //  Not sure what's happening here.
        }
    
        //  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 IBBProviders.Open());
    
        pm.addIQProvider("close","http://jabber.org/protocol/ibb", new IBBProviders.Close());
    
        pm.addExtensionProvider("data","http://jabber.org/protocol/ibb", new IBBProviders.Data());
    
        //  Privacy
        pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider());
    
        pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider());
        pm.addExtensionProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformedActionError());
        pm.addExtensionProvider("bad-locale", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadLocaleError());
        pm.addExtensionProvider("bad-payload", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadPayloadError());
        pm.addExtensionProvider("bad-sessionid", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadSessionIDError());
        pm.addExtensionProvider("session-expired", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.SessionExpiredError());
    }
    

    I got the solution from the following link http://code.google.com/p/asmack/issues/detail?id=23