




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】在Android中使用asmack實現(xiàn)文件的接收和發(fā)送
本篇主要是基于最近幫助朋友在Android中使用asmack庫實現(xiàn)文件的接收和發(fā)送功能時,寫了個參考示例,這里做個記錄,以便于自己以后參考。文件傳輸相關(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本實例中主要采用的是SI+IBB的方式發(fā)送和接收文件。1,首先在連接和登錄之前設(shè)置ProviderManager,同時設(shè)置好全局的文件傳輸管理器(FileTransferManager)fileTransferManager,如下:
/**
*登錄IM服務(wù)器,同時負責(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的方式實現(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,接收文件,主要通過設(shè)置文件傳輸監(jiān)聽器來實現(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>
/**
*前面主要遵循標準XEP-0095來協(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方式來傳輸文件
<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ù)器,并返回了404的錯誤響應(yīng)
<iqid="VFDHn-12"to="hhy@/Smack"
from="blue@/Spark"type="error">
<query
xmlns="/protocol/bytestreams"
sid="js
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 最喜歡的季節(jié)作文(15篇)
- 初心依然600字初三作文9篇
- 我們的暑期生活記事作文(7篇)
- 人教版高一語文:故事里的敘事技巧教案
- 望廬山瀑布藝術(shù)手法賞析:古詩文美學(xué)鑒賞教學(xué)教案
- 八年級戶外團建活動方案
- 文學(xué)理論入門:文學(xué)術(shù)語解釋與教學(xué)教案
- 公交公司規(guī)范活動方案
- 讀書筆記之三字經(jīng)讀后感11篇范文
- 公眾號引流活動方案
- 《鋼鐵是怎樣煉成的》選擇題(含答案)
- 2024年中國融通文化教育集團有限公司招聘筆試參考題庫含答案解析
- 煤礦井下安全避險六大系統(tǒng) 課件 項目五供水施救系統(tǒng)建設(shè)
- 局灶性大腦挫傷伴出血查房
- 醫(yī)院外包業(yè)務(wù)保潔評估報告
- 運動健康:科學(xué)減脂方案
- 河南省天一大聯(lián)考2024屆高一物理第二學(xué)期期末綜合測試模擬試題含解析
- 血液灌流患者護理查房
- 上海開放大學(xué)《集裝箱班輪運輸業(yè)務(wù)與法律》終結(jié)性考試復(fù)習(xí)題庫(附答案)
- 氣象監(jiān)測與預(yù)警系統(tǒng)演示
- 《工程材料》課程教案
評論
0/150
提交評論