2017-05-05 26 views
1
file_upload.setOnClickListener { 
       // Create the file transfer manager 
       var fileTransferInstance:FileTransferManager=FileTransferManager.getInstanceFor(connection) 
       Log.i("id is ",contactPersonJId) 
       // Create the outgoing file transfer 
       fileTransderReceiver=fileTransferInstance.createOutgoingFileTransfer(contactPersonJId+"/Smack") 

       //location of the file 
       locateFile() 

      } 

    fun locateFile(){ 
      var intent:Intent= Intent(applicationContext,LocateImage::class.java) 
      startActivityForResult(intent,IMAGE_REQUEST) 
     } 


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 
      super.onActivityResult(requestCode, resultCode, data) 

      when(requestCode){ 

       IMAGE_REQUEST -> { 

        when(resultCode){ 

         Activity.RESULT_OK -> { 

          val selectedImagePath=data?.getSerializableExtra(LocateImage.Obj.MEDIA_DATA) as? String 
          Log.v("file path is ",selectedImagePath) 

          if(!selectedImagePath.isNullOrEmpty()){ 

           fileTransderReceiver?.sendFile(File(selectedImagePath),"First file") 

                 GetFileResponse().execute(fileTransderReceiver)  


         } 
        } 
       } 
      } 

     } 

private inner class GetFileResponse : AsyncTask<OutgoingFileTransfer?, String,fileTransfer>() { 


     var progressDialog: ProgressDialog? = null 

     override fun onPreExecute() { 
      progressDialog = ProgressDialog.show([email protected], 
        null, "Sending File..."); 
     } 


     override fun doInBackground(vararg params: OutgoingFileTransfer?): fileTransfer { 

      while (!params[0]?.isDone!!){ 

       if (params[0]?.status!!.equals(FileTransfer.Status.error)){ 
        println("ERROR!!! " + params[0]?.error); 
       }else{ 
        println(params[0]?.status); 
        println(params[0]?.progress); 
       } 
      } 

      var fileTransferState=fileTransfer("abc") 
      fileTransferState.status=params[0]?.status 
      fileTransferState.exception=params[0]?.exception 
      fileTransferState.error=params[0]?.error 

      return fileTransferState 

     } 

     override fun onPostExecute(result: fileTransfer?) { 
      if(progressDialog!!.isShowing) 
       progressDialog!!.dismiss() 

      Log.v("Status is ",result?.status.toString()) 
      Log.v("Exception is ",result?.exception.toString()) 
      Log.v("Error is ",result?.error.toString()) 
     } 

    } 

logcat的發送文件:異常,而使用Android的咂嘴

05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Status is: Error 
05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Exception is: org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - cancel 
05-05 18:03:34.593 30459-30459/com.example.itstym.chat_3 V/Error is: null 

我還檢查該文件發送ejabberd服務器上/接收服務。即使進展情況也不是從0更新,而是從初始狀態變爲談判轉移狀態。

更新:

發送XML

http://jabber.org/protocol/si 'ID = 'jsi_8960344439394443510' mime類型= '圖像/ JPEG' 輪廓=' http://jabber.org/protocol/si/profile/file-transfer「>第一個文件http://jabber.org/protocol/bytestreamshttp://jabber.org/protocol/ibb

接收XML

<iq xml:lang='en' to='[email protected]/Android' from='[email protected]/Smack' type='error' id='0GfHL-35'><si xmlns='http://jabber.org/protocol/si' id='jsi_8960344439394443510' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='attachment.jpg'><desc>First file</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='503' type='cancel'><service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>User session not found</text></error></iq>, 

它說,錯誤代碼503服務不可用。

[此鏈接] [1]說503錯誤意味着你沒有提供完整的JId。使用下面的代碼我

要獲得完整的JID:

roster.getPresence(entry.user).from 

它也返回JID在[email protected]形式

更新2檢查天氣文件傳輸服務是否可用

var serviceDiscoveryManager:ServiceDiscoveryManager = Se rviceDiscoveryManager.getInstanceFor(連接) serviceDiscoveryManager.addFeature( 「http://jabber.org/protocol/disco#info 」) serviceDiscoveryManager.addFeature(「 胡言亂語:IQ:隱私」)

 Log.i("Service enable ",FileTransferNegotiator.isServiceEnabled(connection).toString()) 

但它返回false,這意味着文件傳輸服務不可用。

如何啓用文件傳輸服務? FileTransferNegotiator。 setServiceEnabled()函數不可用。

回答

1

我有同樣的問題,然後我調查節並以這種方式解決它。

許多人使用「/啪」或「/資源」作爲JID資源的一部分,但這是錯誤的。

資源路徑隨着用戶的每個在場變化而改變。比方說,我們要發送圖片到該用戶: 「USER1 @ MYDOMAIN」

必須「/資源」或「/啪」的一部分添加到這個JID,它成爲本: USER1 @ MYDOMAIN /資源

但是資源路徑隨存在而改變,所以您必須按照每個存在更改更新資源路徑。 最好的辦法是讓用戶的存在是在名冊聽衆和presencheChanged()方法,你會得到最後的用戶資源部分是這樣的:

Roster roster=getRoster(); 
roster.addRosterListener(new RosterListener() { 
       @Override 
       public void entriesAdded(Collection<Jid> addresses) { 
        Log.d("entriesAdded", "ug"); 
        context.sendBroadcast(new Intent("ENTRIES_ADDED")); 
       } 

       @Override 
       public void entriesUpdated(Collection<Jid> addresses) { 
        Log.d("entriesUpdated", "ug"); 
       } 

       @Override 
       public void entriesDeleted(Collection<Jid> addresses) { 
        Log.d("entriesDeleted", "ug"); 
       } 

       @Override 
       public void presenceChanged(Presence presence) { 
        Log.d("presenceChanged", "ug"); 
        //Resource from presence 
        String resource = presence.getFrom().getResourceOrEmpty().toString(); 
        //Update resource part for user in DB or preferences 
        //... 
       } 
      }); 
} 

資源串會像一些生成的字符串「6u1613j3kv」和JID會成爲: USER1 @ MYDOMAIN/6u1613j3kv

這意味着你必須創建引出傳送這樣的:

EntityFullJid jid = JidCreate.entityFullFrom("[email protected]/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid) 

在你的情況下,你正在使用/Smack這是不正確的。使用存在中的資源部分。

這就是我已經解決了我與smack和Openfire文件傳輸問題。

另外提一下,您必須在您的Openfire服務器添加以下屬性:

xmpp.proxy.enabled - true 
xmpp.proxy.externalip - MY_IP_ADDRESS 
xmpp.proxy.port -7777 

就更不用說了,我使用的Openfire 4.0.2和4.2.2啪。