今天独山子巡检更换了新终端,随之而来的问题是之前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接受即可,至此,问题解决。