版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Android中NFC功能流程圖解析及代碼演示在Android4.0推出的時(shí)候,一個(gè)非常引人注目的功能就是NFC(NearFieldCommunication).NearFieldCommunication(NFC)isasetofshort-rangewirelesstechnologies,typicallyrequiringadistanceof4cmorlesstoinitiateaconnection.NFCallowsyoutosharesmallpayloadsofdatabetweenanNFCtagandanAndroid-powereddevice,orbetweentwoAndroid-powereddevices.翻譯:
近場(chǎng)通訊(NFC)是一系列短距離無線技術(shù),一般需要4cm或者更短去初始化連接。近場(chǎng)通訊(NFC)允許你在NFCtag和Android設(shè)備或者兩個(gè)Android設(shè)備間共享小負(fù)載數(shù)據(jù)。典型的應(yīng)用為刷卡應(yīng)用,如刷信用卡,公交車卡,吃飯的飯卡之類。騰訊2011年1月份文章“Android首款NFC近場(chǎng)通信應(yīng)用推出”,說明了基于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)很快要刮到中國。
下面我們從技術(shù)的層面來分析一下這個(gè)技術(shù)。
官方的圖片示例為:
這是NFC的開發(fā)流程,參考文章“【NFC在android中的應(yīng)用API】”。相關(guān)的類代碼有:NfcAdapter,NdefMessage,NdefRecord,ACTION_TAG_DISCOVERED.
在功能層面上,涉及到了NFC的讀寫功能。下面我們分別來做總結(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代碼(略加注釋):packagecom.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類方法處理當(dāng)新Intent到來事件
@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)行寫操作的時(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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版木制家具生產(chǎn)加工木工合作合同范本4篇
- 2025版委托檢測(cè)合同書-光纖網(wǎng)絡(luò)性能檢測(cè)技術(shù)3篇
- 二零二五版水產(chǎn)品電商平臺(tái)大數(shù)據(jù)分析服務(wù)合同2篇
- 2025年度母子公司新能源儲(chǔ)能技術(shù)研發(fā)合作合同3篇
- 《吳組緗天下太平》課件
- 單板加工自動(dòng)化與智能化技術(shù)考核試卷
- 2025版互聯(lián)網(wǎng)醫(yī)療投資項(xiàng)目融資借款合同3篇
- 《物價(jià)上漲時(shí)政》課件
- 2025年度木工工具租賃與施工服務(wù)承包合同4篇
- 2025年兒童玩具連鎖店加盟合同
- 農(nóng)民工工資表格
- 【寒假預(yù)習(xí)】專題04 閱讀理解 20篇 集訓(xùn)-2025年人教版(PEP)六年級(jí)英語下冊(cè)寒假提前學(xué)(含答案)
- 2024年智能監(jiān)獄安防監(jiān)控工程合同3篇
- 2024年度窯爐施工協(xié)議詳例細(xì)則版B版
- 幼兒園籃球課培訓(xùn)
- 【企業(yè)盈利能力探析的國內(nèi)外文獻(xiàn)綜述2400字】
- 統(tǒng)編版(2024新版)七年級(jí)《道德與法治》上冊(cè)第一單元《少年有夢(mèng)》單元測(cè)試卷(含答案)
- 100道20以內(nèi)的口算題共20份
- 高三完形填空專項(xiàng)訓(xùn)練單選(部分答案)
- 護(hù)理查房高鉀血癥
- 項(xiàng)目監(jiān)理策劃方案匯報(bào)
評(píng)論
0/150
提交評(píng)論