




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用asmack實(shí)現(xiàn)文件的接收和發(fā)送
本篇主要是基于最近幫助朋友在Android中使用asmack庫(kù)實(shí)現(xiàn)文件的接收和發(fā)送功能時(shí),寫(xiě)了個(gè)參考示例,這里做個(gè)記錄,以便于自己以后參考。文件傳輸相關(guān)的XEP協(xié)議參考:2【XEP-0095】StreamInitiation:/extensions/xep-0095.html2【XEP-0096】SIFileTransfer:/extensions/xep-0096.html2【XEP-0030】ServiceDiscovery:/extensions/xep-0030.html2【XEP-0065】SOCKS5Bytestreams:/extensions/xep-0065.html2【XEP-0066】OutofBandData:/extensions/xep-0066.html2【XEP-0047】In-BandBytestreams:/extensions/xep-0047.html本實(shí)例中主要采用的是SI+IBB的方式發(fā)送和接收文件。1,首先在連接和登錄之前設(shè)置ProviderManager,同時(shí)設(shè)置好全局的文件傳輸管理器(FileTransferManager)fileTransferManager,如下:
/**
*登錄IM服務(wù)器,同時(shí)負(fù)責(zé)
連接和登錄
*/
publicbooleanlogin(Stringuser,Stringpassword)
{
ConnectionConfigurationconf=new
ConnectionConfiguration(
IM_HOST,IM_PORT,IM_SERVICE_NAME);
conf.setDebuggerEnabled(true);
conf.setCompressionEnabled(false);
conf.setSendPresence(true);
conf.setSASLAuthenticationEnabled(false);
conf.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
connection=new
XMPPConnection(conf);
ProviderManagerpm=
ProviderManager.getInstance();
//PrivateDataStorage
pm.addIQProvider("query","jabber:iq:private",new
PrivateDataManager.PrivateDataIQProvider());
//RosterExchange
pm.addExtensionProvider("x","jabber:x:roster",new
RosterExchangeProvider());
//MessageEvents
pm.addExtensionProvider("x","jabber:x:event",new
MessageEventProvider());
//ChatState
pm.addExtensionProvider("active",
"/protocol/chatstates",new
ChatStateExtension.Provider());
pm.addExtensionProvider("composing",
"/protocol/chatstates",new
ChatStateExtension.Provider());
pm.addExtensionProvider("paused",
"/protocol/chatstates",new
ChatStateExtension.Provider());
pm.addExtensionProvider("inactive",
"/protocol/chatstates",new
ChatStateExtension.Provider());
pm.addExtensionProvider("gone",
"/protocol/chatstates",new
ChatStateExtension.Provider());
//XHTML
pm.addExtensionProvider("html",
"/protocol/xhtml-im",new
XHTMLExtensionProvider());
//GroupChatInvitations
pm.addExtensionProvider("x","jabber:x:conference",new
GroupChatInvitation.Provider());
//ServiceDiscovery#Items
pm.addIQProvider("query",
"/protocol/disco#items",new
DiscoverItemsProvider());
//ServiceDiscovery#Info
pm.addIQProvider("query",
"/protocol/disco#info",newDiscoverInfoProvider());
//DataForms
pm.addExtensionProvider("x","jabber:x:data",new
DataFormProvider());
//MUCUser
pm.addExtensionProvider("x",
"/protocol/muc#user",newMUCUserProvider());
//MUCAdmin
pm.addIQProvider("query",
"/protocol/muc#admin",newMUCAdminProvider());
//MUCOwner
pm.addIQProvider("query",
"/protocol/muc#owner",newMUCOwnerProvider());
//DelayedDelivery
pm.addExtensionProvider("x",
"jabber:x:delay",newDelayInformationProvider());
//Version
try{
pm.addIQProvider("query","jabber:iq:version",
Class.forName("org.jivesoftware.smackx.packet.Version"));
}catch(ClassNotFoundExceptione)
{
//Not
surewhat'shappeninghere.
}
//VCard
pm.addIQProvider("vCard","vcard-temp",new
VCardProvider());
//OfflineMessageRequests
pm.addIQProvider("offline","/protocol/offline",
newOfflineMessageRequest.Provider());
//OfflineMessageIndicator
pm.addExtensionProvider("offline",
"/protocol/offline",new
OfflineMessageInfo.Provider());
//LastActivity
pm.addIQProvider("query","jabber:iq:last",new
LastActivity.Provider());
//UserSearch
pm.addIQProvider("query","jabber:iq:search",new
UserSearch.Provider());
//SharedGroupsInfo
pm.addIQProvider("sharedgroup","/protocol/sharedgroup",
newSharedGroupsInfo.Provider());
//JEP-33:ExtendedStanza
Addressing
pm.addExtensionProvider("addresses",
"/protocol/address",new
MultipleAddressesProvider());//FileTransfer
pm.addIQProvider("si",
"/protocol/si",newStreamInitiationProvider());
pm.addIQProvider("query",
"/protocol/bytestreams",new
BytestreamsProvider());
//Privacy
pm.addIQProvider("query",
"jabber:iq:privacy",newPrivacyProvider());
pm.addIQProvider("command",
"/protocol/commands",
newAdHocCommandDataProvider());
pm.addExtensionProvider("malformed-action",
"/protocol/commands",
newAdHocCommandDataProvider.MalformedActionError());
pm.addExtensionProvider("bad-locale",
"/protocol/commands",
newAdHocCommandDataProvider.BadLocaleError());
pm.addExtensionProvider("bad-payload",
"/protocol/commands",
newAdHocCommandDataProvider.BadPayloadError());
pm.addExtensionProvider("bad-sessionid",
"/protocol/commands",
newAdHocCommandDataProvider.BadSessionIDError());
pm.addExtensionProvider("session-expired",
"/protocol/commands",
newAdHocCommandDataProvider.SessionExpiredError());
try
{
connection.connect();
connection.login(user,password);
}
catch(XMPPExceptione)
{
e.printStackTrace();
connection
=null;
return
false;
}
fileTransferManager=new
FileTransferManager(connection);
ServiceDiscoveryManagersdm=
ServiceDiscoveryManager.getInstanceFor(connection);
if(sdm==null)
sdm=new
ServiceDiscoveryManager(connection);
sdm.addFeature("/protocol/disco#info");
sdm.addFeature("jabber:iq:privacy");
FileTransferNegotiator.setServiceEnabled(connection,true);
returntrue;
}2,發(fā)送文件,如下:
ButtonbtnSendFile
=(Button)rootView.findViewById(R.id.send_file_btn);
btnSendFile.setOnClickListener(newView.OnClickListener()
{
@Override
publicvoidonClick(Viewv)
{
Toast.makeText(getActivity(),"sendfile",
Toast.LENGTH_SHORT).show();newSendFileTask().execute(newUri[]{uriFile});
}
});
//將發(fā)送文件的操作采用AsyncTask的方式實(shí)現(xiàn)(SendFileTask):
publicclassSendFileTaskextendsAsyncTask<Uri,Integer,
Long>{
@Override
protectedLong
doInBackground(Uri...params){
if
(params.length<1){
returnLong.valueOf(-1);
}
Uri
uriFile=params[0];
FileTransferManagerftm=MainHelloIM.getInstance().getFileTransferManager();
if(ftm!=
null)
{OutgoingFileTransferoft=
ftm.createOutgoingFileTransfer("blue@/Spark");
try
{
String[]proj={MediaStore.Images.Media.DATA};
Cursoractualp_w_picpathcursor=managedQuery(uriFile,proj,null,null,null);
intactual_p_w_picpath_column_index
=actualp_w_picpathcursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualp_w_picpathcursor.moveToFirst();
StringfilePath=actualp_w_picpathcursor.getString(actual_p_w_picpath_column_index);
FilefileToSend=newFile(filePath);
if(fileToSend.exists())
{oft.sendFile(fileToSend,"recvmyfile!");
while(!oft.isDone())
{
if(oft.getStatus().equals(FileTransfer.Status.error))
{
Log.e(TAG,"sendfailed");
}
else
{
Log.i(TAG,"status:"+oft.getStatus()+"|progress:"+
oft.getProgress());
}
Thread.sleep(1000);
}
}
}
catch(XMPPExceptione)
{
e.printStackTrace();
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
return
Long.valueOf(0);
}
}3,接收文件,主要通過(guò)設(shè)置文件傳輸監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn):
FileTransferManagerftm=MainHelloIM.getInstance().getFileTransferManager();ftm.addFileTransferListener(newFileTransferListener()
{
@Override
publicvoidfileTransferRequest(FileTransferRequestfileTransferRequest)
{
Log.i(TAG,"hasfile");IncomingFileTransfertransfer=
fileTransferRequest.accept();
FilesdDir=Environment.getExternalStorageDirectory();
StringfilePath=sdDir.toString()+"/"+
fileTransferRequest.getFileName();
try
{transfer.recieveFile(newFile(filePath));
}
catch(XMPPExceptione)
{
e.printStackTrace();
}
}
});下面為完整的文件傳輸?shù)南⒔换チ鞒蹋?/p>
/**
*前面主要遵循標(biāo)準(zhǔn)XEP-0095來(lái)協(xié)商采用的文件傳輸方式
*///negotiationprofileandstreamhhy->blue//hhy需要發(fā)送p_w_picpath/png格式的文件bookCater.png給blue
<iqid="VFDHn-4"to="blue@/Spark"
from="hhy@/Smack"type="set">
<sixmlns="/protocol/si"
id="jsi_7839940461539037483"
mime-type="p_w_picpath/png"
profile="/protocol/si/profile/file-transfer">
<file
xmlns="/upload/information/20200311/46/202455.jpg"size="448">
<desc>recvmyfile!</desc>
</file>
<feature
xmlns="/protocol/feature-neg">
<x
xmlns="jabber:x:data"type="form">
<fieldvar="stream-method"type="list-single">
<option>
<value>/protocol/bytestreams</value>
</option>
<option>
<value>/protocol/ibb</value>
</option>
</field>
</x>
</feature>
</si>
</iq>blue->hhy//blue返回的結(jié)果顯示blue支持bytestreams和ibb兩種方式傳輸文件
<iqid="VFDHn-4"to="hhy@/Smack"
from="blue@/Spark"type="result">
<sixmlns="/protocol/si">
<feature
xmlns="/protocol/feature-neg">
<x
xmlns="jabber:x:data"type="submit">
<fieldvar="stream-method">
<value>/protocol/bytestreams</value>
<value>/protocol/ibb</value>
</field>
</x>
</feature>
</si>
</iq>//servicediscoveryhhy->blue
<iqid="VFDHn-5"to="blue@/Spark"
type="get">
<queryxmlns="/protocol/disco#info"></query>
</iq>blue->hhy
<iqid="VFDHn-5"to="hhy@/Smack"
type="result"from="blue@/Spark">
<query
xmlns="/protocol/disco#info">
<identity
category="client"name="Smack"type="pc"/>
<feature
var="/protocol/xhtml-im"/>
<feature
var="/protocol/muc"/>
<feature
var="/protocol/bytestreams"/>
<feature
var="/protocol/commands"/>
<featurevar="/protocol/si/profile/file-transfer"/>
<feature
var="/protocol/si"/>
<feature
var="/protocol/ibb"/>
</query>
</iq>hhy->[server]
<iqid="VFDHn-6"to=""
type="get">
<query
xmlns="/protocol/disco#items"></query>
</iq>blue->hhy
<iqid="VFDHn-5"to="hhy@/Smack"
type="result"from="blue@/Spark">
<query
xmlns="/protocol/disco#info">
<identitycategory="client"
name="Smack"type="pc"/>
<feature
var="/extensions/xep-0166.html#ns"/>
<feature
var="urn:xmpp:tmp:jingle"/>
</query>
</iq>[server]->hhy
<iqtype="result"id="VFDHn-6"
from=""to="hhy@/Smack">
<query
xmlns="/protocol/disco#items">
<item
jid=""name="Socks5Bytestreams
Proxy"/>
<item
jid=""name="Publish-Subscribe
service"/>
<item
jid=""name="UserSearch"/>
<item
jid=""name=""/>
</query>
</iq>hhy->[serverproxy]
<iqid="VFDHn-7"to=""
type="get">
<query
xmlns="/protocol/disco#info"></query>
</iq>[serverproxy]->hhy
<iqtype="result"id="VFDHn-7"
from=""to="hhy@/Smack">
<query
xmlns="/protocol/disco#info">
<identity
category="proxy"name="SOCKS5BytestreamsService"
type="bytestreams"/>
<feature
var="/protocol/bytestreams"/>
<feature
var="/protocol/disco#info"/>
</query>
</iq>hhy->[serverpubsub]
<iqid="VFDHn-8"to=""
type="get">
<queryxmlns="/protocol/disco#info"></query>
</iq>[serverpubsub]->hhy
<iqtype="result"id="VFDHn-8"
from=""to="hhy@/Smack">
<query
xmlns="/protocol/disco#info">
<identity
category="pubsub"name="Publish-Subscribeservice"
type="service"/>
<feature
var="/protocol/pubsub"/>
<feature
var="/protocol/pubsub#collections"/>
<feature
var="/protocol/pubsub#config-node"/>
<featurevar="/protocol/pubsub#create-and-configure"/>
<feature
var="/protocol/pubsub#create-nodes"/>
<feature
var="/protocol/pubsub#delete-nodes"/>
<feature
var="/protocol/pubsub#get-pending"/>
<feature
var="/protocol/pubsub#instant-nodes"/>
<feature
var="/protocol/pubsub#item-ids"/>
<feature
var="/protocol/pubsub#meta-data"/>
<feature
var="/protocol/pubsub#modify-affiliations"/>
<feature
var="/protocol/pubsub#manage-subscriptions"/>
<feature
var="/protocol/pubsub#multi-subscribe"/>
<feature
var="/protocol/pubsub#outcast-affiliation"/>
<feature
var="/protocol/pubsub#persistent-items"/>
<feature
var="/protocol/pubsub#presence-notifications"/>
<feature
var="/protocol/pubsub#publish"/>
<feature
var="/protocol/pubsub#publisher-affiliation"/>
<feature
var="/protocol/pubsub#purge-nodes"/>
<feature
var="/protocol/pubsub#retract-items"/>
<feature
var="/protocol/pubsub#retrieve-affiliations"/>
<feature
var="/protocol/pubsub#retrieve-default"/>
<feature
var="/protocol/pubsub#retrieve-items"/>
<feature
var="/protocol/pubsub#retrieve-subscriptions"/>
<feature
var="/protocol/pubsub#subscribe"/>
<feature
var="/protocol/pubsub#subscription-options"/>
<feature
var="/protocol/pubsub#default_access_model_open"/>
<feature
var="/protocol/disco#info"/>
</query>
</iq>hhy->[serversearch]
<iqid="VFDHn-9"to=""
type="get">
<query
xmlns="/protocol/disco#info"></query>
</iq>[serversearch]->hhy
<iqtype="result"id="VFDHn-9"
from=""to="hhy@/Smack">
<query
xmlns="/protocol/disco#info">
<identity
category="directory"type="user"name="User
Search"/>
<feature
var="jabber:iq:search"/>
<feature
var="/protocol/disco#info"/>
<feature
var="/protocol/rsm"/>
</query>
</iq>hhy->[serverconference]
<iqid="VFDHn-10"to=""
type="get">
<queryxmlns="/protocol/disco#info"></query>
</iq>[serverconference]->hhy
<iqtype="result"id="VFDHn-10"
from=""
to="hhy@/Smack">
<query
xmlns="/protocol/disco#info">
<identity
category="conference"name=""
type="text"/>
<identity
category="directory"name="PublicChatroomSearch"
type="chatroom"/>
<feature
var="/protocol/muc"/>
<feature
var="/protocol/disco#info"/>
<featurevar="/protocol/disco#items"/>
<feature
var="jabber:iq:search"/>
<feature
var="/protocol/rsm"/>
</query>
</iq>//首先是采用bytestreams方式傳輸文件的hhy->[serverproxy]
<iqid="VFDHn-11"to=""
type="get">
<query
xmlns="/protocol/bytestreams"/>
</iq>[serverproxy]->hhy
<iqtype="result"id="VFDHn-11"
from=""to="hhy@/Smack">
<query
xmlns="/protocol/bytestreams">
<streamhost
jid=""host=""
port="7777"/>
</query>
</iq>
hhy->blue//這里要求blue采用proxyserver方式來(lái)傳輸文件
<iqid="VFDHn-12"to="blue@/Spark"
type="set">
<query
xmlns="/protocol/bytestreams"sid="jsi_7839940461539037483"
mode="tcp">
<streamhost
jid="hhy@/Smack"host=""
port="7777"/>
<streamhost
jid=""host=""
port="7777"/>
</query>
</iq>
blue->hhy//可以看到blue無(wú)法連接到代理服務(wù)器,并返回了404的錯(cuò)誤響應(yīng)
<iqid="VFDHn-12"to="hhy@/Smack"
from="blue@/Spark"type="error">
<query
xmlns="/protocol/bytestreams"
sid="js
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年補(bǔ)償貿(mào)易借款合同協(xié)議書(shū)樣本
- 語(yǔ)出建筑(山東聯(lián)盟)知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春濰坊科技學(xué)院
- 畢業(yè)答辯開(kāi)題報(bào)告-1
- 2024年浙大寧波理工學(xué)院招聘事業(yè)編制工作人員真題
- 第六單元 美麗的校園-認(rèn)識(shí)方向(教案)-二年級(jí)上冊(cè)數(shù)學(xué)青島版
- 2024年山東省精神衛(wèi)生中心招聘真題
- 2024年寧德市閩東醫(yī)院聘用燒傷科副主任醫(yī)師招聘筆試真題
- 水表出售合同范本
- 2024年臨滄市市屬事業(yè)單位考試真題
- 2024年拉薩市市屬事業(yè)單位考試真題
- 生理學(xué)(全套課件)
- 香港公司條例
- 污水處理系統(tǒng)工程合同范本
- 路基石方破碎開(kāi)挖專(zhuān)項(xiàng)施工方案
- 德能勤績(jī)廉個(gè)人總結(jié)的
- 二年級(jí)美術(shù)上冊(cè)課件 《3.我的手印畫(huà)》 贛美版 (共18張PPT)
- Q∕SY 126-2014 油田水處理用緩蝕阻垢劑技術(shù)規(guī)范
- GB∕T 3216-2016 回轉(zhuǎn)動(dòng)力泵 水力性能驗(yàn)收試驗(yàn) 1級(jí)、2級(jí)和3級(jí)
- 電子電氣評(píng)估規(guī)范-最新
- 黑布林繪本 Dad-for-Sale 出售爸爸課件
- 腹腔鏡下肝葉切除術(shù)(實(shí)用課件)
評(píng)論
0/150
提交評(píng)論