<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > Android 2.3.3 近場(chǎng)通信NFC介紹

          Android 2.3.3 近場(chǎng)通信NFC介紹

          作者: 時(shí)間:2012-04-19 來源:網(wǎng)絡(luò) 收藏

          ( )

          本文引用地址:http://www.ex-cimer.com/article/155082.htm

          是一套短距離的無線,通常距離是 4 厘米或更短。 工作頻率是 13.56M Hz, 傳輸速率是 106kbit/s 到848kbit/s. NFC 總是在一個(gè)發(fā)起者和一個(gè)被動(dòng)目標(biāo)之間發(fā)生。發(fā)起者發(fā)出無線電波,這個(gè)可以給被動(dòng)目標(biāo)供電。這些被動(dòng)的目標(biāo)包括不需要電源的標(biāo)簽,卡,也可以是有電源的設(shè)備。

          與其他無線技術(shù)比較, 例如藍(lán)牙和 WiFi , NFC 提供更低貸款和距離,并且低成本,不需要供電,不需要實(shí)現(xiàn)匹配,整個(gè)通信過程僅僅是短短的靠近一秒就能完成。

          一個(gè)帶有 NFC 支持的 android 設(shè)備通常是一個(gè)發(fā)起者。也可以作為 NFC 的讀寫設(shè)備。他將檢測(cè) NFC tags 并且打開一個(gè)Activity 來處理 . 還有支持有限的 P2P 。

          Tags 分很多種,其中簡(jiǎn)單的只提供讀寫段,有的只能讀。復(fù)雜的 tags 可以支持一些運(yùn)算,加密來控制對(duì) tags 里數(shù)據(jù)段的讀寫。甚至一些 tags 上有簡(jiǎn)單的操作系統(tǒng),允許一些復(fù)雜的交互和可以執(zhí)行一些代碼。

          API 概覽

          .nfc package 包含頂層類用來與本地 NFC 適配器交互 . 這些類可以表示被檢測(cè)到的 tags 和用 NDEF 數(shù)據(jù)格式。

          QQ截圖20120619152112.jpg

          android.nfc.techpackage 包含那些對(duì) tag 查詢屬性和進(jìn)行 I/O 操作的類。這些類分別標(biāo)示一個(gè) tag 支持的不同的NFC 技術(shù)標(biāo)準(zhǔn)。

          QQ截圖20120619152128.jpg

          聲明 Manifest.xml 的元素

          在你能訪問一個(gè)設(shè)備的 NFC 硬件和正確的處理 NFC 的 Intent 之前,需要在 AndroidManifest.xml 中先聲明下面的項(xiàng):

          1. NFC 使用 元素來訪問 NFC 硬件 :

          2. 最小 SDK 版本需要設(shè)置正確, API level 9 只包含有限的 tag 支持 , 包括:

          . 通過 ACTION_TAG_DISCOVERED來發(fā)布 Tag 信息

          . 只有通過 EXTRA_NDEF_MESSAGES擴(kuò)展來訪問 NDEF 消息

          . 其他的 tag 屬性和 I/O 操作都不支持

          所以你可能想要用 API level 10 來實(shí)現(xiàn)對(duì) tag 的廣泛的讀寫支持。

          3. uses-feature 元素定義:你的程序可以再 android 市場(chǎng)里顯示有 NFC 硬件。

          4. NFC intent filter 告訴 android 系統(tǒng)你的 activity 能處理 NFC 數(shù)據(jù),可以定義 1 個(gè)或多個(gè) intent filter :

          android:resource = @xml/nfc_tech_filter .xml />

          上邊 3 個(gè) intent filters 有優(yōu)先級(jí),更多信息可以看下面的 Tag 發(fā)布系統(tǒng)

          也可以看 NFCDemo 例子的 AndroidManifest.xml 來有個(gè)更深的理解。

          Tag 發(fā)布系統(tǒng)

          當(dāng) android 設(shè)備掃描到一個(gè) NFC tag ,通用的行為是自動(dòng)找最合適的 Activity 會(huì)處理這個(gè) tag Intent 而不需要用戶來選擇哪個(gè) Activity 來處理。因?yàn)樵O(shè)備掃描 NFC tags 是在很短的范圍和時(shí)間,如果讓用戶選擇的話,那就有可能需要移動(dòng)設(shè)備,這樣將會(huì)打斷這個(gè)掃描過程。你應(yīng)該開發(fā)你只處理需要處理的 tags 的 Activity ,以防止讓用戶選擇使用哪個(gè) Activity來處理的情況。 Android 提供兩個(gè)系統(tǒng)來幫助你正確的識(shí)別一個(gè) NFC tag 是否是你的 Activity 想要處理的: Intent 發(fā)布系統(tǒng)和前臺(tái) Activity 發(fā)布系統(tǒng)。

          Intent 發(fā)布系統(tǒng)檢查所有 Activities 的 intent filters ,找出那些定義了可以處理此 tag 的 Activity ,如果有多個(gè) Activity 都配置了處理同一個(gè) tag Intent ,那么將使用 Activity 選擇器來讓用戶選擇使用哪個(gè) Activity 。用戶選擇之后,將使用選擇的 Activity 來處理此 Intent .

          前臺(tái)發(fā)布系統(tǒng)允許一個(gè) Activity 覆蓋掉 Intent 發(fā)布系統(tǒng)而首先處理此 tag Intent ,這要求你將要處理 Tag Intent 的 Activity運(yùn)行在前臺(tái),這樣當(dāng)一個(gè) NFC tag 被掃描到,系統(tǒng)先檢測(cè)前臺(tái)的 Activity 是否支持處理此 Intent ,如果支持,即將此Intent 傳給此 Activity ,如果不支持,則轉(zhuǎn)到 Intent 發(fā)布系統(tǒng)。

          使用 Intent 發(fā)布系統(tǒng)

          Intent 發(fā)布系統(tǒng)指定了 3 個(gè) intent 有不同的優(yōu)先級(jí)。通常當(dāng)一個(gè) tag 被檢測(cè)到之后, Intent 就被啟動(dòng)( start )了,這個(gè)啟動(dòng)遵循以下行為 :

          · android.nfc.action.NDEF_DISCOVERED : 這個(gè) intent 是在一個(gè)包含 NDEF 負(fù)載的 tag 被檢測(cè)到時(shí)啟動(dòng),這是最高優(yōu)先級(jí)的 intent, android 系統(tǒng)不會(huì)讓你指定一個(gè) Intent 能處理所有的 NFC 數(shù)據(jù)類型,你必須在AndroidManifest.xml 中指定與 NFC tag 對(duì)應(yīng)的 元素,這樣當(dāng)掃描到的 tag 傳過來的數(shù)據(jù)類型與你定義的相匹配時(shí),你的 Activity 就會(huì)被調(diào)用。例如想處理一個(gè)包含 plain text 的 NDEF_DISCOVERED intent ,你要按照如下定義AndroidManifest.xml file:

          如果 NDEF_DISCOVERED intent 已經(jīng)被啟動(dòng), TECH_DISCOVERED 和 TAG_DISCOVERED intents 將不會(huì)被啟動(dòng)。假如一個(gè)未知的 tag 或者不包含 NDEF 負(fù)載的 tag 被檢測(cè)到,此 Intent 就不會(huì)被啟動(dòng)。

          · android.nfc.action.TECH_DISCOVERED : 如果 NDEF_DISCOVERED intent 沒啟動(dòng)或者沒有一個(gè) Activity 的filter 檢測(cè) NDEF_DISCOVERED ,并且此 tag 是已知的,那么此 TECH_DISCOVERED Intent 將會(huì)啟動(dòng) .TECH_DISCOVERED intent 要求你在一個(gè)資源文件里 (xml) 里指定你要支持 technologies 列表。更多細(xì)節(jié)請(qǐng)看下面的Specifying tag technologies to handle .

          · android.nfc.action.TAG_DISCOVERED : 如果沒有一個(gè) activity 處理 _DISCOVERED and TECH_DISCOVEREDintents 或者 tag 被檢測(cè)為未知的,那么此 Intent 將會(huì)被啟動(dòng)。

          Specifying tag technologies to handle 指定處理的 technologies

          假如你的 Activity 在 AndroidManifest.xml 文件里聲明了處理 android.nfc.action.TECH_DISCOVERED intent,你必須創(chuàng)建一個(gè) Xml 格式的資源文件,并加上你的 activity 支持的 technologies 到 tech-list 集合里。這樣你的 activity將被認(rèn)作能處理這些 tech-list 的處理者,如果 tag 使用的 technology 屬于你的定義的 list 里,你的 Activity 將接收此Intent 。你可以用 getTechList() 來獲得 tag 支持的 technologies 。

          例如:如果一個(gè) tag 被檢測(cè)到支持 MifareClassic, NdefFormatable, 和 NfcA ,你的 tech-list 集合必須指定了其中的一項(xiàng)或者多項(xiàng)來保證你的 Activity 能處理此 Intent 。

          下面是一個(gè)資源文件例子,定義了所有的 technologies. 你可以根據(jù)需要?jiǎng)h掉不需要的項(xiàng),將此文件以任意名字 +.xml 保存到 /res/xml 文件夾 .

          asis:names:tc:xliff:document:1.2 >

          android.nfc.tech.IsoDep

          android.nfc.tech.NfcA

          android.nfc.tech.NfcB

          android.nfc.tech.NfcF

          android.nfc.tech.NfcV

          android.nfc.tech.Ndef

          android.nfc.tech.NdefFormatable

          android.nfc.tech.MifareClassic

          android.nfc.tech.MifareUltralight

          你也可以指定多個(gè) tech-list 集合,每個(gè)集合都認(rèn)做獨(dú)立的。如果任何單個(gè) tech-list 集合是 getTechList() 返回的technologies 集合的子集,那么你的 Activity 將被認(rèn)為匹配了。這個(gè)還提供 ’ 與 ’ 和 ’ 或 ’ 操作。下面的例子表示支持NfcA 和 NDef 的卡,或者支持 NfcB 和 NDef 的卡:

          asis:names:tc:xliff:document:1.2 >

          android.nfc.tech.NfcA

          android.nfc.tech.Ndef

          asis:names:tc:xliff:document:1.2 >

          android.nfc.tech.NfcB

          android.nfc.tech.Ndef

          在 AndroidManifest.xml 文件中 , 指定這個(gè) tech-list 資源文件的方法是在 元素中創(chuàng)建 元素,例如下面例子 :

          ...

          android:resource = @xml/nfc_tech_filter />

          ...

          使用前臺(tái)發(fā)布系統(tǒng) Using the foreground dispatch system

          前臺(tái)發(fā)布系統(tǒng)允許一個(gè) Activity 攔截一個(gè) tag Intent 獲得最高優(yōu)先級(jí)的處理,這種方式很容易使用和實(shí)現(xiàn):

          1. 添加下列代碼到 Activity 的 onCreate() 方法里

          a. 創(chuàng)建一個(gè) PendingIntent對(duì)象 , 這樣 Android 系統(tǒng)就能在一個(gè) tag 被檢測(cè)到時(shí)定位到這個(gè)對(duì)象

          PendingIntent pendingIntent = PendingIntent . getActivity (

          this , 0 , new Intent ( this , getClass ()). addFlags ( Intent .FLAG_ACTIVITY_SINGLE_TOP ), 0 );

          b. 在 Intent filters 里聲明你想要處理的 Intent ,一個(gè) tag 被檢測(cè)到時(shí)先檢查前臺(tái)發(fā)布系統(tǒng),如果前臺(tái) Activity 符合Intent filter 的要求,那么前臺(tái)的 Activity 的將處理此 Intent 。如果不符合,前臺(tái)發(fā)布系統(tǒng)將 Intent 轉(zhuǎn)到 Intent 發(fā)布系統(tǒng)。如果指定了 null 的 Intent filters ,當(dāng)任意 tag 被檢測(cè)到時(shí),你將收到 TAG_DISCOVERED intent 。因此請(qǐng)注意你應(yīng)該只處理你想要的 Intent 。

          p2p機(jī)相關(guān)文章:p2p原理



          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();