由于Android具有良好的开源优势,可进行深度定制开发。 安卓系统市场应用比windows晚,虽然支持的应用不如windows系统多,但由于系统的免费开放性,众多软件厂商经过近几年的开发,已经有越来越多的应用加入进来,目前支持办公、教学、娱乐已经完全没有问题。因此,越来越多的行业接受并认可基于Android操作系统的设备。

目前市面上大多数工业控制设备开始采用Android系统了,然而这部分设备并没有搭载原生的NFC功能。随着近年来,NFC功能需求的兴起,很多行业需要一直可以支持Android系统的可接入Android设备并进行二次开发的 NFC读写器。因此, L3-U这款NFC读写器 应运而生。作为一款采用USB免驱 的NFC读写器,支持在windows、Android、linux等操作系统,免费提供基于上述各种系统的SDK,方便客户进行功能扩展和二次开发。

L3-U这款USB免驱动NFC读写器已经设计好了USB 驱动,用户在基于Android系统的设备上只有能获取USB HOST权限或者采用OTG传输就可以使用,无需安装额外驱动。如果你其它非标准的Android设备,需要提供设备我们进行编译驱动。以下为标准的具有USB HOST权限的设备接入NFC读写器的过程。供大家在进行NFC读写器二次开发过程中参考!

1、在项目中对AndroidManifest.xml文件进行配置,获取相关权限。

 <uses-permission android:name="android.permission.NFC" /><uses-featureandroid:name="android.hardware.nfc"android:required="true" />    <uses-sdkandroid:minSdkVersion="12"android:targetSdkVersion="17" /><intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/*" /></intent-filter>                       <intent-filter><action android:name="android.nfc.action.TECH_DISCOVERED" /></intent-filter><meta-dataandroid:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" />
<uses-permission android:name="android.permission.NFC" /><uses-featureandroid:name="android.hardware.nfc"android:required="true" />  添加了这句代码,会使得在应用商店下载应用是过滤掉不支持NFC功能的设备。

这里声明了三种intent筛选条件,分别是action为

android.nfc.action.NDEF_DISCOVERED,

android.nfc.action.TECH_DISCOVERED,

android.nfc.action.TAG_DISCOVERED。

这一步可以帮助android系统内的NFC模块在扫描到一个NFC目标的时候寻找到我们的activity来进行交互。

android系统内的NFC模块在扫描到一个NFC目标后会通过以下几步来寻找到合适的处理NFC消息的activity。在这之前先介绍两个概念,1、Tag代表一个NFC目标,当android设备扫描到一个NFC目标的时候会将相关数据封装成一个Tag实例,通过Intent传递给合适的activity去做处理。2、TagTechnology表示NFC标签支持的技术,可以通过Tag的getTechList()获取。

Tag的分发步骤:

a、先看Tag中是否包含了系统支持的NDEF数据,如果包含则分发给注册了action为ACTION_NEDF_DISCOVERED的activity。

b、如果Tag中不包含系统支持的NDEF数据或者没有找到注册了action为ACTION_NDEF_DISCOVERED的activity,则NFC系统模块尝试分发给一个action为ACTION_TECH_DISCOVERED的activity。NFC系统模块在分发是首先分析NFC Tag支持的Tag Technology,然后寻找支持这类Tag Technology的activity,然后封装了Tag数据的Intent分发给对应的activity。

c、如果上面两种都不满足,则发送action为ACTION_TAG_DISCOVERED的intent

2、建立一个Activity页面,用于实现NFC读写的功能。NFC读写功能实现的代码如下:

package cc.lotusnfc;import java.io.IOException;
import java.nio.charset.Charset;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Arrays;import cc.lotusnfc.R;import android.nfc.FormatException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.Ndef;
import android.nfc.tech.NfcA;
import android.os.Bundle;
import android.os.Parcelable;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {private TextView resultText;private PendingIntent pendingIntent;private IntentFilter[] mFilters;private String[][] mTechLists;private Button mJumpTagBtn;private boolean isFirst = true;private NfcAdapter m_NfcAdpater;private EditText m_edtLog;private Intent m_NfcIntent  = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {// 获取nfc适配器,判断设备是否支持NFC功能m_NfcAdpater = NfcAdapter.getDefaultAdapter(this);if (m_NfcAdpater == null) {Toast.makeText(this, "Not Found NfcAdapter!", Toast.LENGTH_SHORT).show();//finish();//return;} else if (!m_NfcAdpater.isEnabled()) {Toast.makeText(this, "Please Enabled NfcAdapter",Toast.LENGTH_SHORT).show();//finish();//return;}super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);m_edtLog = (EditText) findViewById(R.id.edtLog);m_edtLog.setText("");pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);ndef.addCategory("*/*");mFilters = new IntentFilter[] { ndef };// 过滤器mTechLists = new String[][] {new String[] { MifareClassic.class.getName() },new String[] { NfcA.class.getName() } };// 允许扫描的标签类型}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@SuppressLint("NewApi")@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();m_NfcAdpater.enableForegroundDispatch(this, pendingIntent, mFilters,mTechLists);}private NdefMessage createMessage(String text) {NdefRecord[] record = new NdefRecord[1];String lang = "en";byte[] langBytes = lang.getBytes(Charset.forName("US-ASCII"));byte[] textBytes = text.getBytes(Charset.forName("UTF-8"));char status = (char) (langBytes.length);byte[] data = new byte[1 + langBytes.length + textBytes.length];data[0] = (byte) status;System.arraycopy(langBytes, 0, data, 1, langBytes.length);System.arraycopy(textBytes, 0, data, 1 + langBytes.length,textBytes.length);record[0] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT, new byte[0], data);return new NdefMessage(record);}@Overrideprotected void onNewIntent(Intent intent) {// TODO Auto-generated method stubsuper.onNewIntent(intent);m_NfcIntent = intent;String strWriteText = "春眠不觉晓";if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);Ndef ndef = Ndef.get(tagFromIntent);if (ndef != null) {NdefMessage ndefMessage = createMessage(strWriteText);try {ndef.connect();// READNdefMessage msg = ndef.getNdefMessage();if(null == msg) return;NdefRecord[] records = msg.getRecords();// NdefMessage nmsg = (NdefMessage) msgs[0];NdefRecord record = records[0];String resultStr = "";if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN) {if (Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {byte[] payload = record.getPayload();if (payload == null)return;try {String textEString = ((payload[0] & 0x80) == 0) ? "UTF-8": "UTF-16";int languageCodeLength = payload[0] & 0x3f;resultStr = new String(payload,languageCodeLength + 1, payload.length- languageCodeLength - 1,textEString);AddLog("Read:" + resultStr);} catch (Exception e) {e.printStackTrace();}}}// WRITEndef.writeNdefMessage(ndefMessage);AddLog("WRITE:" + strWriteText);ndef.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();AddLog("IOException" );} catch (FormatException e) {// TODO Auto-generated catch blocke.printStackTrace();AddLog("FormatException" );}}}}private void AddLog(String strLog) {SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");Date curDate = new Date(System.currentTimeMillis());// 获取当前时间String strDate = formatter.format(curDate);if (null == m_edtLog)return;String strLogs = m_edtLog.getText().toString().trim();if (strLogs.equals("")) {strLogs = strDate + " " + strLog;} else {strLogs += "\r\n" + strDate + " " + strLog;}m_edtLog.setText(strLogs);}public void OnClearLogListener(View arg0) {if (null == m_edtLog)return;m_edtLog.setText("");}public void OnSetNfcListener(View arg0) {startActivityForResult(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS), 0);        }public void OnTestListener(View arg0) {String strWriteText = "春眠不觉晓";if(null == m_NfcIntent) return;if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(m_NfcIntent.getAction())) {Tag tagFromIntent = m_NfcIntent.getParcelableExtra(NfcAdapter.EXTRA_TAG);Ndef ndef = Ndef.get(tagFromIntent);if (ndef != null) {NdefMessage ndefMessage = createMessage(strWriteText);try {ndef.connect();// READNdefMessage msg = ndef.getNdefMessage();NdefRecord[] records = msg.getRecords();// NdefMessage nmsg = (NdefMessage) msgs[0];NdefRecord record = records[0];String resultStr = "";if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN) {if (Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {byte[] payload = record.getPayload();if (payload == null)return;try {String textEString = ((payload[0] & 0x80) == 0) ? "UTF-8": "UTF-16";int languageCodeLength = payload[0] & 0x3f;resultStr = new String(payload,languageCodeLength + 1, payload.length- languageCodeLength - 1,textEString);AddLog("Read:" + resultStr);} catch (Exception e) {e.printStackTrace();}}}// WRITEndef.writeNdefMessage(ndefMessage);AddLog("WRITE:" + strWriteText);ndef.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (FormatException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

USB免驱NFC读写器 Android系统中NFC读写范例相关推荐

  1. 用c语言编写rfid读卡系统,USB免驱RFID读写器编程解析之一:智能卡篇

    随着RFID应用的普及,越来越多的软件工程师需要使用RFID读写器编程来实现自己的需求.为了使软件工程师更快的了解RFID读写器的使 用,本文选择一款市面上常用的USB免驱RFID读写器SDT-HA来 ...

  2. java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能

    基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...

  3. WinUsb实现USB免驱通讯技术总结

    随着电脑更新换代.USB接口逐渐替代传统接口(串口等),为了更加方便与PC机进行通讯,引入USB通讯. 如何才能实现产品与PC又快又稳定通讯 如何解决串口通讯中接受不定时帧间隔问题 如何实现即插即用的 ...

  4. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  5. Android系统中如何添加USB网络共享

    Android系统中如何添加USB网络共享 类别 需求 索引类别 USB网络共享 问题描述 平台是RT1296,在Android系统中已经有支持USB网络共享,但相应的产品系统中还未开启USB网络共享 ...

  6. 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

    文章目录 一.Android 逆向中使用的 android.permission 权限 二.Android 系统中的 Linux 用户权限 一.Android 逆向中使用的 android.permi ...

  7. Android 系统中 Location Service 的实现与架构

    定位服务是移动设备上最常用的功能之一,本文以 Android 源码为基础,详细分析了 Android 系统中定位服务的架构和实现. 在 Android 系统中,所有系统服务的实现都是类似的.只要明白其 ...

  8. android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用

    数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...

  9. Android系统中固件崩溃后使用uevent机制重新加载固件 流程分析

    [前言] Android系统为了保证各商业公司的利益,允许在系统中使用不开源的固件.因此我们可以看到比如用于音频处理的.用于键盘支持的等等大量固件.既然这么多模块要用到固件,那么我们也有必要来了解一下 ...

  10. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

最新文章

  1. 2018-2019-1 20165212 20165313 2016522 实验一 开发环境的熟悉
  2. MVP架构设计 进阶三
  3. Ext.Net学习笔记10:Ext.Net ComboBox用法
  4. Webapi管理和性能测试工具WebBenchmark
  5. 【音视频安卓开发 (四)】AndroidStudio项目配置权限、jni库路径、ABI
  6. 机器学习笔记(十四)——HMM估计问题和前向后向算法
  7. linux的initrd.img的解压和打包
  8. linux删除目录tmpab是什么意思_linux 下tmp目录文件怎么被删除的?
  9. 设置php中字符编码_php如何设置字符编码
  10. warning: control may reach end of non-void function [-Wreturn-type]
  11. 使用 Auto-TS 自动化时间序列预测
  12. java sub_java调用zeromq PUB-SUB模式
  13. 平面中圆与矩形相交判定
  14. 【电脑使用】桌面图标有蓝底怎么去掉
  15. linux sub减法指令出错,sparc的指令的一些总结
  16. html5页面中添加腾讯地图api
  17. Xposed 模块编写
  18. Cisco路由器和交换机型号
  19. Linux 的父进程和子进程的执行情况(附有案例代码)
  20. Android中铃声的使用

热门文章

  1. circ2Traits:环状RNA相关疾病数据库
  2. linux logo程序设计,Android开机LOGO的修改
  3. 在电脑上如何剪辑音乐?
  4. 华成英模拟电子技术笔记(1)-绪
  5. 计算机应用历年高考真题,春季高考历年真题-2013年天津市春季高考计算机试卷...
  6. 啦啦外卖40.7 APP小程序三端 独立开源版本
  7. 贪吃蛇c语言代码 链表,链表贪吃蛇 附代码
  8. http权威指南(一)-Http概述
  9. 怎么在苹果手机计算机上打字,iPhone苹果手机在打字时如何进行换行
  10. 使用maven打包bootdo并运行