gpt4 book ai didi

android - 使用 smack Android 发送文件时出现异常

转载 作者:行者123 更新时间:2023-11-30 00:33:36 25 4
gpt4 key购买 nike

    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(this@chatActivity,
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())
}

}

日志:

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 更新,而是状态从 initial 更改为 negotiating transfer。

更新:

发送 XML

http://jabber.org/protocol/si' id='jsi_8960344439394443510' mime-type='image/jpeg' profile=' http://jabber.org/protocol/si/profile/file-transfer '>第一个文件http://jabber.org/protocol/bytestreams http://jabber.org/protocol/ibb

接收 XML

 <iq xml:lang='en' to='user1@replica3377.cloudapp.net/Android' from='user2@replica3377.cloudapp.net/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

它也以 user2@replica3377.cloudapp.net 的形式返回 Jid

更新 2:

使用下面的代码我检查了天气文件传输服务是否可用

var serviceDiscoveryManager:ServiceDiscoveryManager= ServiceDiscoveryManager.getInstanceFor(连接) serviceDiscoveryManager.addFeature("http://jabber.org/protocol/disco#info ") serviceDiscoveryManager.addFeature("jabber:iq:privacy")

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

但它返回 false,这意味着文件传输服务不可用。

如何启用文件传输服务? FileTransferNegotiator。 setServiceEnabled() 函数不可用。

最佳答案

我遇到了同样的问题,然后我调查了节并以这种方式解决了它。

许多人使用 "/Smack"或 "/Resource" 作为 jid 中的资源部分,但这可以通过其他方式完成。

资源路径随着用户每次出现的变化而变化。假设我们要将图像发送给该用户:“user1@mydomain”

你必须在这个 jid 中添加“/Resource”或“/Smack”部分,它变成这样: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("user1@mydomain/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 和 Smack 4.2.2。

这也可以通过简单的方式进行配置,只需将资源设置为

XMPPTCPConnectionConfiguration.Builder .

喜欢

XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
XMPPTCPConnectionConfiguration.builder();

configurationBuilder.setResource("yourResourceName");

关于android - 使用 smack Android 发送文件时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com