2013-05-14 1 views
1

SMACK과 Openfire를 사용하여 Android에서 개발 한 채팅 응용 프로그램에서 파일 전송 기능을 구현하고 싶습니다. 그러나 파일을 보내고받는 데 오류가 있습니다. 아무도이 문제를 해결할 수 있도록 도와 줄 수 없습니다. 미리 감사드립니다. .안드로이드에서 SMACK을 사용하여 파일을 보내고 받도록 리스너를 만드는 방법은 무엇입니까?

다음은 파일을 수신하기위한 코드입니다.

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"); 
     XMPPConnection.DEBUG_ENABLED = true; 
     // Create the file transfer manager 
     final FileTransferManager managerListner = new FileTransferManager(connection); 
     FileTransferNegotiator.setServiceEnabled(connection, true); 
     Log.i("File transfere manager", "created"); 
     managerListner.addFileTransferListener(new FileTransferListener() 
     { 

      @Override 
      public void fileTransferRequest(FileTransferRequest request) { 
       // TODO Auto-generated method stub 
       Log.i("Recieve File","new file transfere request new file transfere request new file transfere request"); 
       Log.i("file request","from" + request.getRequestor()); 
       IncomingFileTransfer transfer = request.accept(); 
       Log.i("Recieve File alert dialog", "accepted"); 
       try { 
        transfer.recieveFile(new File("/mnt/sdcard/" + request.getFileName())); 
        while (!transfer.isDone() || (transfer.getProgress() < 1)) { 

         Thread.sleep(1000); 
         Log.i("Recieve File alert dialog", "still receiving : "+ (transfer.getProgress()) + " status "+ transfer.getStatus()); 
          if (transfer.getStatus().equals(org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) { 
           // Log.i("Error file", 
           // transfer.getError().getMessage()); 
            Log.i("Recieve File alert dialog", 
             "cancelling still receiving : " 
               + (transfer.getProgress()) 
               + " status " 
               + transfer.getStatus()); 
            transfer.cancel(); 
            break; 
          } 
        } 
       }catch (XMPPException e) { 
        // TODO: handle exception 
         e.printStackTrace(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
      }  
     }); 

다음은 내가 발생한 오류입니다.

02:48:58 PM RCV (1079277904): <iq type="error" id="6gQg0-6" to="admin-pc/cc4dd310" from="[email protected]/Smack"><si xmlns="http://jabber.org/protocol/si" id="jsi_3030055238839806007" profile="http://jabber.org/protocol/si/profile/file-transfer"><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="sdcard"><desc>test</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><error code="405" type="cancel"><not-allowed xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq> 

답변

0

주로 오류는 파일을 공유 할 수있는 공급자 관리자 구성을 추가하지 않아 발생합니다. 제공 관리자 클래스에 정적 코드에 다음을 추가하십시오 것은

// 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()); 

또한 파일 공유를 활성화하기 위해 사격 서버에 다음과 같은 속성을 추가 할 수 있습니다.

xmpp.proxy.enabled =true 
xmpp.proxy.externalip =your public ip 
xmpp.proxy.port =7777 

이 방법이 유용 할 것입니다.

+0

xmpp.proxy.externalip이 무엇인지 설명해 주시겠습니까? 내 경우에는 http://192.168.0.102:9090을 externalip으로 설정했습니다. 괜찮습니까? –

+0

서버가 로컬 인 경우 192.168.0.102 이 인터넷의 웹 서버에서 호스팅되고 서버의 IP에서 호스팅되는 경우. 도메인 이름을 매핑하는 데 사용되는 하지만 로컬로 사용하는 경우에는 192.168.0.102 으로 이동하면 도움이되기를 바랍니다. – Bug

+0

Ok 도움을 주셔서 대단히 감사합니다. –

관련 문제