NFC讀卡在fragment中的應用

今天獨山子巡檢更換了新終端,隨之而來的問題是之前RFID標籤讀取硬件(之前是通過接口直接獲取)沒有了,而是用了NFC模塊,然後就看了看API,以及google了下。使用很簡單,就三個步驟:

First
在mainifest文件聲明權限以及在目標Activity下添加Action,這些API都有,如下

權限聲明
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
目標Activity下添加<intent-filter>
<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>
nfc-tech-filter 文件是res/xml文件下自建
有兩種方式
1、
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>
2、
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>
我的理解是這樣:第一種是&的關係,第二種是||的關係,即第一種需要都支持,才能跳轉,而第二種只要支持一種就能跳轉

Second

在目標Activity的onCreate()中獲取NfcAdapter實例
adapter = NfcAdapter.getDefaultAdapter(this)
   if(adapter==null){
            tv_show.text="設備不支持NFC"
            finish()
            return
        }
        if(!adapter!!.isEnabled){
            tv_show.text="請在系統設置中先啓用NFC功能!"
            finish()
            return
        }

Third
在onresume()方法中獲取標籤值

val tagFromIntent = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)
val uidBytes = tagFromIntent.getId()
val uid :String? = bytesToHexString(uidBytes)

實際問題
每次刷標籤的時候,目標activity聲明週期都會執行一次,以至於依附在activity上的fragment都會重新刷新,之前的數據都會清除,不能達到巡檢時候指定頁面不變,只獲取標籤數據的目的。
解決辦法
首先把目標Activity的啓動模式改爲singleTask,然後在目標Activity的onNewIntent(Intent intent)中寫讀取標籤的邏輯。然後通過事件總線框架(EventBus)發送到指定fragment接受即可,至此,問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章