Android读取NFCA类型的数据
一、概要
本例子为读取nfca类型的数据,应用场景是读取燃气卡的id。
二、示例代码
1.在AndroidManifest.xml中加入nfc权限
<!-- 支持nfc功能--> <uses-permission android:name="android.permission.NFC" /> <!-- 只有提供了nfc功能的手机可安装--> <uses-feature android:name="android.hardware.nfc" android:required="true" />
2.新建一个BaseNfcActivity
public class BaseNfcActivity extends FragmentActivity { protected NfcAdapter mNfcAdapter; private PendingIntent mPendingIntent; /** * onCreat->onStart->onResume->onPause->onStop->onDestroy * 启动Activity,界面可见时. */ @Override protected void onStart() { super.onStart(); //此处adapter需要重新获取,否则无法获取message mNfcAdapter = NfcAdapter.getDefaultAdapter(this); //一旦截获NFC消息,就会通过PendingIntent调用窗口 mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0); if (!ifNFCUse()) { ToastUtil.getInstance() .showTips(this, R.mipmap.ic_launcher, "请在系统中打开nfc功能"); } } /**以下是nfc相关的介绍*/ /** * 检测工作,判断设备的NFC支持情况 * * @return */ protected boolean ifNFCUse() { if (mNfcAdapter == null) { ToastUtil.getInstance().show(this, "设备不支持NFC!"); return false; } if (mNfcAdapter != null && !mNfcAdapter.isEnabled()) { ToastUtil.getInstance().show(this, "请在系统设置中先启用NFC功能!"); return false; } return true; } /**nfc介绍结束*/ /** * 获得焦点,按钮可以点击 */ @Override public void onResume() { super.onResume(); //设置处理优于所有其他NFC的处理 if (mNfcAdapter != null) mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); } /** * 暂停Activity,界面获取焦点,按钮可以点击 */ @Override public void onPause() { super.onPause(); //恢复默认状态 if (mNfcAdapter != null) mNfcAdapter.disableForegroundDispatch(this); } }
3.新建一个子类SubNfcActivity继承BaseNfcActivity
public class SubNfcActivity extends BaseNfcActivity { private String mTagText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ic_card_distinguish); }
//必须要重写onNewIntent,不然获取不到ic卡数据 @Override public void onNewIntent(Intent intent) { //1.获取Tag对象 super.onNewIntent(intent); String icCardString = readNFCAData(intent); Log.e("ic卡号:",icCardString);
} /** * 读取nfca类型的卡号 * @param intent * @return */ public String readNFCAData(Intent intent){ //1.获取Tag对象 StringBuilder sb = new StringBuilder(); Bundle datas = intent.getExtras(); Set<String> keys = datas.keySet(); for (String key : keys){ if("android.nfc.extra.ID".equals(key)){ String data = byteArrayToHex((byte[]) datas.get(key)); String replaceSpace = getReverseStr(data); sb.append(Long.parseLong(replaceSpace,16)); } } return sb.toString(); } /** * 得到的data数据取反 * @param data * @return */ private String getReverseStr(String data){ String[] icStrSub = data.split(" "); StringBuilder myResult = new StringBuilder(); for(int i=icStrSub.length-1;i>=0;i--){ myResult.append(icStrSub[i]); } return myResult.toString(); } private String byteArrayToHex(byte[] bytes) { StringBuffer sBuffer = new StringBuffer(); for(byte b : bytes){ int hexInt = b<0?256+b:b; if(hexInt<10){ sBuffer.append("0"+Integer.toHexString(hexInt)+" "); }else{ sBuffer.append(Integer.toHexString(hexInt)+" "); } } return sBuffer.toString().toUpperCase(); } }
4.在AndroidManifest.xml中注册Activity,并且吧其启动模式设置给singleTop
<activity android:name=".SubNfcActivity" android:launchMode="singleTop" />
到此就结束了,把代码往项目中一贴,运行一下做测试就行了。
注意事项:
ic卡识别页面尽量不要有什么可以获取焦点的地方(特别是第一项),不然会出现莫名其妙的问题。在上述案例中表现为,如果SubNfcActivity的布局中有一个向左的返回按钮,则识别过程中有很大概率返回按钮会被选中,页面会莫名其妙关闭的情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库