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接受即可,至此,问题解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值