版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ú)線(xiàn)技術(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)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度無(wú)線(xiàn)電頻率占用費(fèi)支付合同3篇
- 2024年員工與企業(yè)共同創(chuàng)業(yè)股權(quán)入股協(xié)議3篇
- 2024年度五金建材行業(yè)銷(xiāo)售代理合作協(xié)議3篇
- 2024年幼兒園園長(zhǎng)任期教育質(zhì)量提升聘用合同范本3篇
- 2024年度金融服務(wù)代理居間合作協(xié)議3篇
- 2024年無(wú)保險(xiǎn)勞務(wù)派遣服務(wù)外包與合作協(xié)議3篇
- 2024年度環(huán)保產(chǎn)業(yè)知識(shí)產(chǎn)權(quán)保護(hù)及合作協(xié)議范本3篇
- 2024年度風(fēng)景名勝區(qū)栽樹(shù)保護(hù)承包合同3篇
- 2024學(xué)校圖書(shū)館數(shù)字資源與紙質(zhì)圖書(shū)采購(gòu)一體化合同3篇
- 2024年度個(gè)人與個(gè)人之間互助借款合同3篇
- 三年級(jí)語(yǔ)文學(xué)情全面分析
- MOOC創(chuàng)新創(chuàng)業(yè)與管理基礎(chǔ)(東南大學(xué))
- 中國(guó)八大植被區(qū)域劃分
- 自動(dòng)生產(chǎn)排程 SMT 多線(xiàn)體 版
- 鋼筋籠吊裝方案履帶吊
- 中職英語(yǔ)基礎(chǔ)模塊第二版8單元說(shuō)課課件
- 培養(yǎng)教育考察記實(shí)簿
- 110與120聯(lián)動(dòng)協(xié)議書(shū)
- 中國(guó)鐵路總公司鐵路建設(shè)項(xiàng)目監(jiān)理招標(biāo)文件示范文本
- 高三地理一模考試質(zhì)量分析報(bào)告課件
- 聚合物鋰電池規(guī)格表
評(píng)論
0/150
提交評(píng)論