要获取NFC标签,首先需要添加NFC权限

<uses-feature

android:name="android.hardware.nfc"

android:required="true"/>

<uses-permission android:name="android.permission.NFC"/>

获取NFC标签及其ID

class NfcActivity : BaseActivity() {private lateinit var imgBack: ImageViewprivate lateinit var mNfcAdapter: NfcAdapterprivate lateinit var mPendingIntent: PendingIntent//nfc标签信息private lateinit var tvNfcTag: TextView//nfc十进制IDprivate lateinit var tvNfcD: TextView//nfc16进制IDprivate lateinit var tvNfcH: TextView/*** 启动Activity*/override fun onStart() {super.onStart()mNfcAdapter = NfcAdapter.getDefaultAdapter(this)//一旦截获NFC消息,就会通过PendingIntent调用窗口mPendingIntent = PendingIntent.getActivity(this, 0, Intent(this, javaClass), 0)}override fun getLayoutId(): Int {return R.layout.activity_nfc}override fun eventBus(event: Any?) {}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)imgBack = findViewById(R.id.img_nfc_back)tvNfcD = findViewById(R.id.tv_nfc_d)tvNfcH = findViewById(R.id.tv_nfc_h)tvNfcTag = findViewById(R.id.tv_nfc_tag)imgBack.setOnClickListener { finish() }}override fun onResume() {super.onResume()//设置处理优于所有其他NFC的处理mNfcAdapter.enableForegroundDispatch(this,mPendingIntent,null,null)}override fun onPause() {super.onPause()//恢复默认状态mNfcAdapter.disableForegroundDispatch(this)}override fun onNewIntent(intent: Intent?) {super.onNewIntent(intent)//        readFromTag(intent);readNfcTag(intent!!)}/*** 读取NFC标签文本数据*/private fun readNfcTag(intent: Intent) {val tag: Tag? = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)if (tag != null) {val cardNo = flipHexStr(ByteArrayToHexString(tag.id)).toLong(16)tvNfcD.text = cardNo.toString()tvNfcH.text = ByteArrayToHexString(tag.id)}if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {val rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)var msgs: Array<NdefMessage?>? = nullvar contentSize = 0if (rawMessages != null) {msgs = arrayOfNulls(rawMessages.size)for (i in rawMessages.indices) {msgs[i] = rawMessages[i] as NdefMessagecontentSize += msgs[i]!!.toByteArray().size}}try {if (null != msgs) {val record = msgs[0]!!.records[0]val textRecord: String? =NfcUtil.parseTextRecord(record)Log.e("nfcTag-->", "" + textRecord)tvNfcTag.text = textRecord}} catch (e: Exception) {e.printStackTrace()Log.e("nfcError-->", "" + e)}}}
}

获取标签及其ID的工具类

public class NfcUtil {/*** 解析NDEF文本数据,从第三个字节开始,后面的文本数据* @param ndefRecord* @return*/public static String parseTextRecord(NdefRecord ndefRecord) {/*** 判断数据是否为NDEF格式* 判断TNF*/if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {return null;}//判断可变的长度的类型if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {return null;}try {//获得字节数组,然后进行分析byte[] payload = ndefRecord.getPayload();//下面开始NDEF文本数据第一个字节,状态字节//判断文本是基于UTF-8还是UTF-16的,取第一个字节"位与"上16进制的80,16进制的80也就是最高位是1,//其他位都是0,所以进行"位与"运算后就会保留最高位String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16";//3f最高两位是0,第六位是1,所以进行"位与"运算后获得第六位int languageCodeLength = payload[0] & 0x3f;//下面开始NDEF文本数据第二个字节,语言编码//获得语言编码String languageCode = new String(payload, 1, languageCodeLength, StandardCharsets.US_ASCII);//下面开始NDEF文本数据后面的字节,解析出文本String textRecord = new String(payload, languageCodeLength + 1,payload.length - languageCodeLength - 1, textEncoding);return textRecord;} catch (Exception e) {throw new IllegalArgumentException();}}// 16转10进制public static String flipHexStr(String s) {StringBuilder result = new StringBuilder();for (int i = 0; i <= s.length() - 2; i = i + 2) {result.append(new StringBuilder(s.substring(i, i + 2)).reverse());}return result.reverse().toString();}public static String ByteArrayToHexString(byte[] inarray) {int i, j, in;String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A","B", "C", "D", "E", "F"};StringBuilder out = new StringBuilder();for (j = 0; j < inarray.length; ++j) {in = (int) inarray[j] & 0xff;i = (in >> 4) & 0x0f;out.append(hex[i]);i = in & 0x0f;out.append(hex[i]);}return out.toString();}
}

Android获取NFC标签和NFC十进制16进制ID相关推荐

  1. 二进制-八进制-十进制-16进制之间的转换

    进制之间的转换 主要用到连个函数: Convert.ToInt32(str,numbased):将字符串转成str,按照numbeased指定的进制转成10进制数: Convert.ToString( ...

  2. 【Android开发】android最全的颜色对应的16进制代码(androidUI设计必备)

    颜色代码大全 AA 指定透明度. 00 是完全透明. FF 是完全不透明.超出取值范围的值将被恢复为默认值. ffff00 ffff33 ffff66 ffff99 ffffcc ffffff ffc ...

  3. 如何实现晶圆载具ACSII码条码数据与TI玻璃管RFID标签16进制数据匹配

    如何实现电子货架的晶圆载具ACSII码条码数据与TI玻璃管RFID标签16进制数据配批,更有效实现人工识别与自动化识别的配合,实现人.机.码三者的最优化方案,是半导体电子货架供应商必须优先考虑的问题. ...

  4. c语言中的16进制坐标计算器,十六进制计算器_16进制计算器

    16进制计算器 开始--所有程序--附件--计算器 电脑计算器16进制转换10进制怎么用 在电脑自带的计算器中启用"程序员"设置,即可进行16进制转换10进制的操作.具体操作请参照 ...

  5. 软件设计师之根据16进制内存地址计算内存大小(超详细)

    首先我们来看一道17年下半年的真题: 内存按字节编址.若用存储容量为32Kx8bit的存储器芯片构成地址从AOOOOH到DFFFFH的内存,则至少需要( )片芯片. 这道题的解题思路就是用题目给的内存 ...

  6. 能转16进制的计算机软件,16进制计算器能否完成各种不同进制的转换?

    在使用16进制计算器的时候,并没有复杂的步骤,整个操作是非常简单的,而且还支持多款安卓手机下载使用,它占用的空间是比较小的,凭借着非常好用的特色,成为众多用户提升工作效率的一款必备工具. 16进制计算 ...

  7. 计算机进制各用什么字母表示方法,16进制字母大还是数字大 16进制中的字母代表什么...

    F字母使用大写这六个字母来分别表示16进制多位数字母需要换算,E,范围从00000000-111111表示0到2一位16进制数用二进制表示是xxxx最多只表示到15即对应16进制的F.作业,但这种混合 ...

  8. 16进制转10进制方法

    16进制: D58F 10进制: 54671 公式计算方法: 15 +8*16+5*(16*16)+13*(16*16*16) = 54671 讲解如下: 十六进制转换十进制 16进制就是逢16进1, ...

  9. C#16进制字符和16进制整数的转换

    (1)获取TextBox中的内容转换为16进制数字 string strCanID = CanIDText.Text; uint a = Convert.ToUInt32(strCanID, 16); ...

最新文章

  1. C/C++:sizeof('a')的值为什么不一样?
  2. 图文并茂,详细讲解UML类图符号、各种关系说明以及举例
  3. cordova 不打开浏览器_[Cordova inAppBrowser 在App内打开浏览器]
  4. 【学习笔记】高等数据基础
  5. wxWidgets:布局窗口/窗扇示例
  6. EntityFramework Core 3.0 Preview
  7. 如何解决IIS配置报错问题:存储空间不足?
  8. 分数化小数(指定精度)
  9. Java 多线程 通信 通道 (猫狗赛跑)
  10. linux C 多进程架构,linux c 多进程多线程比较
  11. 汇编语言程序设计(一)
  12. 新手入门:手把手从PHP环境到ThinkPHP6框架下载
  13. 两个PDF合并成一个PDF怎么做?三分钟教会你两种方法
  14. php imagick 教程,php imagick蒙版做法
  15. 计算机如何重新连接打印机,打印机脱机怎么处理 打印机重新连接方法教程
  16. 企业u盘系统服务器,服务器u盘装系统
  17. centos服务器无法上网
  18. 静候 CSDN 佳音
  19. 安全狗下一代网站防篡改产品全面支持容器防篡改
  20. 面对众多的在线打印平台该怎么选择?

热门文章

  1. 已解决FileNotFoundError: [WinError 2] 系统找不到指定的文件。
  2. Modbus 通讯协议 (RTU传输模式)
  3. 剖析非同质化代币ERC721-全面解析ERC721标准
  4. 8266+DS3231时钟之显示TM1638的使用【四】上
  5. 【莫烦Python】Python 基础教程——学习笔记
  6. SpringBoot【The request was rejected because the URL was not normalized】
  7. 花游双人、三级跳斩获金银
  8. 雷军狂送20亿给员工:网络工程师怎样才能最快体验到大厂待遇?
  9. 刀片服务器部署VMWare vSphere遇到的问题总结
  10. 用Java计算出租车的费用