【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用 asmack 實(shí)現(xiàn)文件的接收和發(fā)送_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用 asmack 實(shí)現(xiàn)文件的接收和發(fā)送_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用 asmack 實(shí)現(xiàn)文件的接收和發(fā)送_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用 asmack 實(shí)現(xiàn)文件的接收和發(fā)送_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】在Android中使用 asmack 實(shí)現(xiàn)文件的接收和發(fā)送_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論