版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育法規(guī)測(cè)試卷(含答案)
- 咨詢工程師(投資)《宏觀經(jīng)濟(jì)政策與發(fā)展規(guī)劃》考前沖刺必會(huì)試題及答案
- 我在國(guó)旗下講話演講稿
- 致施工單位的感謝信范文
- 研究生考試考研教育學(xué)專(zhuān)業(yè)基礎(chǔ)(311)試卷及答案指導(dǎo)(2024年)
- 幼兒園評(píng)估自查報(bào)告15篇
- 2024年度設(shè)備保修服務(wù)協(xié)議細(xì)則
- 2024年商業(yè)買(mǎi)賣(mài)合作協(xié)議精簡(jiǎn)
- 2024年合作伙伴保密協(xié)議
- 2024年監(jiān)理協(xié)議延期實(shí)施細(xì)則協(xié)議
- 腦梗死恢復(fù)期康復(fù)臨床路徑表單
- 拆除橋梁專(zhuān)項(xiàng)施工方案范本
- 煙氣含氧量計(jì)算公式
- 光的反射(課件)五年級(jí)科學(xué)上冊(cè)(蘇教版)
- 中醫(yī)飲食護(hù)理課件ppt
- 反電信網(wǎng)絡(luò)詐騙法知識(shí)考試參考題庫(kù)(350題)
- RB/T 125-2022種養(yǎng)殖企業(yè)(組織)溫室氣體排放核查通則
- 《神奇的科幻畫(huà)》課件-1
- T-ZAQ 10116-2023 新時(shí)代基層理論宣講0576 工作法操作規(guī)范
- 地下停車(chē)場(chǎng)交安設(shè)施施工方案車(chē)庫(kù)交通安全設(shè)施施工方案標(biāo)志標(biāo)線交通設(shè)施
- cad及天正快捷鍵大全
評(píng)論
0/150
提交評(píng)論