android中nfc功能流程圖解析及代碼演示_第1頁(yè)
android中nfc功能流程圖解析及代碼演示_第2頁(yè)
android中nfc功能流程圖解析及代碼演示_第3頁(yè)
已閱讀5頁(yè),還剩5頁(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)介

Android中NFC功能流程圖解析及代碼演示在Android4.0推出的時(shí)候,一個(gè)非常引人注目的功能就是NFC(NearFieldCommunication).NearFieldCommunication(NFC)isasetofshort-rangewirelesstechnologies,typicallyrequiringadistanceof4cmorlesstoinitiateaconnection.NFCallowsyoutosharesmallpayloadsofdatabetweenanNFCtagandanAndroid-powereddevice,orbetweentwoAndroid-powereddevices.翻譯:

近場(chǎng)通訊(NFC)是一系列短距離無(wú)線技術(shù),一般需要4cm或者更短去初始化連接。近場(chǎng)通訊(NFC)允許你在NFCtag和Android設(shè)備或者兩個(gè)Android設(shè)備間共享小負(fù)載數(shù)據(jù)。典型的應(yīng)用為刷卡應(yīng)用,如刷信用卡,公交車(chē)卡,吃飯的飯卡之類(lèi)。騰訊2011年1月份文章“Android首款NFC近場(chǎng)通信應(yīng)用推出”,說(shuō)明了基于Android的NFC應(yīng)用目前已經(jīng)有了,得益于日本在手機(jī)刷卡的應(yīng)用氛圍。據(jù)2011年7月網(wǎng)易文章“PayPal推出Android系統(tǒng)NFC移動(dòng)支付服務(wù)”報(bào)道,PayPal已經(jīng)做了嘗試了,相信這股風(fēng)很快要刮到中國(guó)。

下面我們從技術(shù)的層面來(lái)分析一下這個(gè)技術(shù)。

官方的圖片示例為:

這是NFC的開(kāi)發(fā)流程,參考文章“【NFC在android中的應(yīng)用API】”。相關(guān)的類(lèi)代碼有:NfcAdapter,NdefMessage,NdefRecord,ACTION_TAG_DISCOVERED.

在功能層面上,涉及到了NFC的讀寫(xiě)功能。下面我們分別來(lái)做總結(jié)。

在代碼層上面:使用的時(shí)候,需要在AndroidManifest.xml里面加一些權(quán)限以及屬性。<uses-permissionandroid:name="android.permission.NFC"/>

<uses-featureandroid:name="android.hardware.nfc"android:required="true"/>

<uses-sdkandroid:minSdkVersion="10"/>這里注意,在AndroidVersion9的時(shí)候僅僅支持了ACTION_TAG_DISCOVERED,對(duì)于其他的需要10以上。在上面的基礎(chǔ)上,還需要增加intent-filter的支持。<intent-filter>

<actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/>

<categoryandroid:name="ent.category.DEFAULT"/>

<dataandroid:mimeType="text/plain"/>

</intent-filter>獲取NfcAdapter的代碼為publicstaticStringgetStatusNfcDevice(){

NfcAdapternfcAdapter=NfcAdapter.getDefaultAdapter();

if(nfcAdapter.isEnabled()){

Stringstatus="enabled";

returnstatus;

}

else{

Stringstatus="disabled";

returnstatus;

}

}處理函數(shù)為publicvoidonResume(){

super.onResume();

if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){

Parcelable[]rawMsgs=intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

if(rawMsgs!=null){

msgs=newNdefMessage[rawMsgs.length];

for(inti=0;i<rawMsgs.length;i++){

msgs[i]=(NdefMessage)rawMsgs[i];

}

}

}

//processthemsgsarray

}完整的一個(gè)操作代碼摘自GoogleAndroidNFCGuide代碼(略加注釋?zhuān)簆ackagecom.example.android.beam;

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.nfc.NdefMessage;

importandroid.nfc.NdefRecord;

importandroid.nfc.NfcAdapter;

importandroid.nfc.NfcAdapter.CreateNdefMessageCallback;

importandroid.nfc.NfcEvent;

importandroid.os.Bundle;

importandroid.os.Parcelable;

importandroid.widget.TextView;

import

importjava.nio.charset.Charset;

//繼承并實(shí)現(xiàn)接口CreateNdefMessageCallback方法createNdefMessage

publicclassBeamextendsActivityimplementsCreateNdefMessageCallback{

NfcAdaptermNfcAdapter;

TextViewtextView;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextViewtextView=(TextView)findViewById(R.id.textView);

//CheckforavailableNFCAdapter

//檢測(cè)是否有NFC適配器

mNfcAdapter=NfcAdapter.getDefaultAdapter(this);

if(mNfcAdapter==null){

Toast.makeText(this,"NFCisnotavailable",Toast.LENGTH_LONG).show();

finish();

return;

}

//Registercallback

//注冊(cè)回調(diào)函數(shù)

mNfcAdapter.setNdefPushMessageCallback(this,this);

}

@Override

publicNdefMessagecreateNdefMessage(NfcEventevent){

Stringtext=("Beammeup,Android!\n\n"+

"BeamTime:"+System.currentTimeMillis());

//回調(diào)函數(shù),構(gòu)造NdefMessage格式

NdefMessagemsg=newNdefMessage(

newNdefRecord[]{createMimeRecord(

"application/com.example.android.beam",text.getBytes())

//,NdefRecord.createApplicationRecord("com.example.android.beam")

});

returnmsg;

}

@Override

publicvoidonResume(){

super.onResume();

//ChecktoseethattheActivitystartedduetoanAndroidBeam

//得到是否檢測(cè)到ACTION_NDEF_DISCOVERED觸發(fā)

if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){

processIntent(getIntent());

}

}

//重載Activity類(lèi)方法處理當(dāng)新Intent到來(lái)事件

@Override

publicvoidonNewIntent(Intentintent){

//onResumegetscalledafterthistohandletheintent

setIntent(intent);

}

//關(guān)鍵處理函數(shù),處理掃描到的NdefMessage

voidprocessIntent(Intentintent){

textView=(TextView)findViewById(R.id.textView);

Parcelable[]rawMsgs=intent.getParcelableArrayExtra(

NfcAdapter.EXTRA_NDEF_MESSAGES);

//onlyonemessagesentduringthebeam

NdefMessagemsg=(NdefMessage)rawMsgs[0];

//record0containstheMIMEtype,record1istheAAR,ifpresent

textView.setText(newString(msg.getRecords()[0].getPayload()));

}

publicNdefRecordcreateMimeRecord(StringmimeType,byte[]payload){

byte[]mimeBytes=mimeType.getBytes(Charset.forName("US-ASCII"));

NdefRecordmimeRecord=newNdefRecord(

NdefRecord.TNF_MIME_MEDIA,mimeBytes,newbyte[0],payload);

returnmimeRecord;

}

}上面代碼還需要在AndroidManifest.xml文件里面添加<intent-filter>

<actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/>

<categoryandroid:name="ent.category.DEFAULT"/>

<dataandroid:mimeType="application/com.example.android.beam"/>

</intent-filter>在對(duì)NFC設(shè)備進(jìn)行寫(xiě)操作的時(shí)候,相關(guān)代碼:privatevoidenableTagWriteMode(){

mWriteMode=true;

IntentFiltertagDetected=newIntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);

mWriteTagFilters=newIntentFilter[]{tagDetected};

mNfcAdapter.enableForegroundDispatch(this,mNfcPendingIntent,mWriteTagFilters,null);

}@Override

protectedvoidonNewIntent(Intentintent){

//Tagwritingmode

if(mWriteMode&&NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){

TagdetectedTag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

if(NfcUtils.writeTag(NfcUtils.getPlaceidAsNdef(placeidToWrite),detectedTag)){

Toast.makeText(this,"Success:Wroteplaceidtonfctag",Toast.LENGTH_LONG)

.show();

NfcUtils.soundNotify(this);

}else{

Toast.makeText(this,"Writefailed",Toast.LENGTH_LONG).show();

}

}

}

publicstaticbooleanwriteTag(NdefMessagemessage,Tagtag){

intsize=message.toByteArray().length;

try{

Ndefndef=Ndef.get(tag);

if(ndef!=null){

ndef.connect();

if(!ndef.isWritable()){

returnfalse;

}

if(ndef.getMaxSize()<size){

returnfalse;

}

ndef.writeNdefMessage(message);

returntrue;

}else{

NdefFormatableformat=NdefFormatable.get(tag);

if(format!=null){

try{

format.connect();

format.format(message);

returntrue;

}catch(IOExceptione){

returnfalse;

}

}else{

returnfalse;

}

}

}catch

溫馨提示

  • 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)論