设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

查看: 772|回复: 4

Android如何实现NFC读取卡片信息

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:17
  • 最近打卡:2024-01-29 09:13:37
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
43
主题
37
精华
0
金钱
145
积分
82
注册时间
2023-10-4
最后登录
2025-5-31

发表于 2024-4-11 13:44:58 | 显示全部楼层 |阅读模式
目录


  • 效果图
  • 支持NFC的Android设备同时支持以下三种主要操作模式
  • NFC读取卡片数据流程
  • 实现读取北京地铁卡数据功能
  • 总结

效果图

1.gif

因为朋友需要个读取NFC卡片数据的功能,所以最近看了一下Android 系统下NFC 读取卡片信息的操作。
NFC(近距离无线通信 ) 是一组近距离无线技术,通常只有在距离不超过 4 厘米时才能启动连接.借助 NFC,您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。

支持NFC的Android设备同时支持以下三种主要操作模式


  • 读取器/写入器模式:支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。
  • 点对点模式:支持 NFC 设备与其他 NFC 对等设备交换数据;- Android Beam 使用的就是此操作模式。
  • 卡模拟模式:支持 NFC 设备本身充当 NFC 卡。然后,可以通过外部 NFC 读取器(例如 NFC 销售终端)访问模拟 NFC 卡。

NFC读取卡片数据流程


  • Android 设备通常会在屏幕解锁后查找 NFC 标签(停用NFC除外)
  • 卡片接近启动标签调度系统
  • 数据通过Intent携带数据启动Activity
标签调度系统定义了三种 Intent,按优先级从高到低列出如下:   
1.  ACTION_NDEF_DISCOVERED:如果扫描到包含 NDEF 负载的标签,并且可识别其类型,则使用此 Intent 启动 Activity。这是优先级最高的 Intent,标签调度系统会尽可能尝试使用此 Intent 启动 Activity,在行不通时才会尝试使用其他 Intent。   
2.  ACTION_TECH_DISCOVERED :如果没有登记要处理 ACTION_NDEF_DISCOVERED Intent 的 Activity,则标签调度系统会尝试使用此 Intent 来启动应用。此外,如果扫描到的标签包含无法映射到 MIME 类型或 URI 的 NDEF 数据,或者该标签不包含 NDEF 数据,但它使用了已知的标签技术,那么也会直接启动此 Intent(无需先启动 ACTION_NDEF_DISCOVERED)。   
3.  ACTION_TAG_DISCOVERED:如果没有处理 ACTION_NDEF_DISCOVERED 或者 ACTION_TECH_DISCOVERED Intent 的 Activity,则使用此 Intent 启动 Activity。

  • 启动Activity 处理Intent携带的数据

实现读取北京地铁卡数据功能

1. 配置NFC权限
  1.     <!--    API 级别 9 仅通过  所以最低是10版本-->
  2.     <uses-sdk android:minSdkVersion="10" />
  3.     <!--    NFC 权限  -->
  4.     <uses-permission android:name="android.permission.NFC" />
  5.     <!--    以便您的应用仅在那些具备 NFC 硬件的设备的 Google Play 中显示:-->
  6.     <uses-feature
  7.         android:name="android.hardware.nfc"
  8.         android:required="true" />
复制代码
2. 配置NFC拉起页面的过滤器选项
  1.         <!--NFC启动的页面 -->
  2.         <activity android:name=".NFCActivity">
  3.             <!--  配置过滤启动类型-->
  4.             <intent-filter>
  5.                 <action android:name="android.nfc.action.TECH_DISCOVERED" />
  6.             </intent-filter>
  7.             <meta-data
  8.                 android:name="android.nfc.action.TECH_DISCOVERED"
  9.                 android:resource="@xml/nfc_tech_filter" />

  10.             <!--            <intent-filter>-->
  11.             <!--                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>-->
  12.             <!--                <category android:name="android.intent.category.DEFAULT"/>-->
  13.             <!--                <data android:scheme="http"-->
  14.             <!--                    android:host="developer.android.com"-->
  15.             <!--                    android:pathPrefix="/index.html" />-->
  16.             <!--            </intent-filter>-->

  17.             <!--            <intent-filter>-->
  18.             <!--                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>-->
  19.             <!--                <category android:name="android.intent.category.DEFAULT"/>-->
  20.             <!--                <data android:mimeType="text/plain" />-->
  21.             <!--            </intent-filter>-->

  22.         </activity>
复制代码
注意 nfc_tech_filter.xml 是过滤NFC 卡片类型
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
  3.     <!-- 可以处理所有Android支持的NFC类型 -->
  4.     <tech-list>
  5.         <tech>android.nfc.tech.IsoDep</tech>
  6.     </tech-list>
  7.     <tech-list>
  8.         <tech>android.nfc.tech.NfcA</tech>
  9.     </tech-list>
  10.     <tech-list>
  11.         <tech>android.nfc.tech.NfcB</tech>
  12.     </tech-list>
  13.     <tech-list>
  14.         <tech>android.nfc.tech.NfcF</tech>
  15.     </tech-list>
  16.     <tech-list>
  17.         <tech>android.nfc.tech.NfcV</tech>
  18.     </tech-list>
  19.     <tech-list>
  20.         <tech>android.nfc.tech.Ndef</tech>
  21.     </tech-list>
  22.     <tech-list>
  23.         <tech>android.nfc.tech.NdefFormatable</tech>
  24.     </tech-list>
  25.     <tech-list>
  26.         <tech>android.nfc.tech.MifareUltralight</tech>
  27.     </tech-list>
  28.     <tech-list>
  29.         <tech>android.nfc.tech.MifareClassic</tech>
  30.     </tech-list>
  31. </resources>
复制代码
4. 启动页面代码
  1. import android.content.Intent
  2. import android.nfc.NdefMessage
  3. import android.nfc.NdefRecord.createMime
  4. import android.nfc.NfcAdapter
  5. import android.nfc.NfcEvent
  6. import android.nfc.Tag
  7. import android.os.Bundle
  8. import android.widget.Toast
  9. import androidx.appcompat.app.AppCompatActivity
  10. import androidx.databinding.DataBindingUtil
  11. import com.wkq.nfc.databinding.ActivityMainBinding

  12. /**
  13. * NFC 拉起页面
  14. */
  15. class NFCActivity : AppCompatActivity(), NfcAdapter.CreateNdefMessageCallback {

  16.     //支持的标签类型
  17.     private var nfcAdapter: NfcAdapter? = null
  18.     private var binding: ActivityMainBinding? = null
  19.     override fun onCreate(savedInstanceState: Bundle?) {
  20.         super.onCreate(savedInstanceState)
  21.         binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
  22.         nfcAdapter = NfcAdapter.getDefaultAdapter(this)
  23.         if (nfcAdapter==null){
  24.             Toast.makeText(this, "该机型不支持NFC", Toast.LENGTH_LONG).show()   
  25.             finish()
  26.         }
  27.         // Register callback  *设置一个回调,使用Android Beam(TM)动态生成要发送的NDEF消息。
  28.         nfcAdapter?.setNdefPushMessageCallback(this, this)
  29.     }


  30.     override fun onResume() {
  31.         super.onResume()
  32.         // Check to see that the Activity started due to an Android Beam
  33.         if (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action) {
  34.             processIntent(intent)
  35.         }
  36.     }

  37.     override fun onPause() {
  38.         super.onPause()
  39.         nfcAdapter!!.disableReaderMode(this)
  40.     }

  41.     override fun onNewIntent(intent: Intent?) {
  42.         super.onNewIntent(intent)
  43.         setIntent(intent)
  44.     }

  45.     /**
  46.      * 处理Intent携带的数据
  47.      */
  48.     private fun processIntent(intent: Intent) {
  49.         // 处理北京公交卡的数据
  50.         var tag = intent.extras
  51.         if (tag==null)return
  52.   
  53.         var content = NFCUtil.bytesToHex((tag!!.get("android.nfc.extra.TAG") as Tag).id)
  54.         binding?.tvContent!!.text = content
  55.         Toast.makeText(this, "获取北京地铁卡数据:" + content, Toast.LENGTH_LONG).show()
  56.     }

  57.     override fun createNdefMessage(event: NfcEvent?): NdefMessage {
  58.         val text = "Beam me up, Android!\n\n" +
  59.                 "Beam Time: " + System.currentTimeMillis()
  60.         return NdefMessage(
  61.             arrayOf(
  62.                 createMime("application/vnd.com.example.android.beam", text.toByteArray())
  63.             )
  64.         )

  65.     }
  66. }
复制代码
这里是简单的利用NFC读取卡片数据的操作,具体的数据处理只是简单的处理了北京公交卡的数据,具体项目业务上需要读取什么卡数据需要项目中具体去处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
14
积分
8
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2024-12-8 01:52:25 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-1-17 06:03:47 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-2-16 08:31:50 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-3-20 23:29:40 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表