读取NfcA格式数据
如何读取数据?
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcA nfcA = NfcA.get(tag);
nfcA.connect();
byte[] SELECT = {(byte) 0x30, (byte) 0x05};//我读取的NFC卡片使用的是NTAG216的芯片,这里的指令参数是根据其datasheet的说明写的。
byte[] result = nfcA.transceive(SELECT);//这里会返回16个字节的数据,根据芯片不同会有差异
该芯片的快速读写命令是0x3A,可以指定读取页数范围,在使用快速读写命令时,发现读取范围超过70字节android就会报错,所以使用了每次最多读取64字节的方式。
- package com.yorkg.android.nfc;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.PendingIntent;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.nfc.NfcAdapter;
- import android.nfc.Tag;
- import android.nfc.tech.MifareClassic;
- import android.nfc.tech.NfcA;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- import com.yorkg.android.nfc.dataobject.mifare.MifareBlock;
- import com.yorkg.android.nfc.dataobject.mifare.MifareClassCard;
- import com.yorkg.android.nfc.dataobject.mifare.MifareSector;
- import com.yorkg.android.nfc.util.Converter;
- public class MyFirstNFCDemoActivity extends Activity {
- /** Called when the activity is first created. */
- private Button clearBtn = null;
- private EditText sealCompanyName = null;
- private EditText sealName = null;
- private EditText sealNumber = null;
- private EditText sealTaxId = null;
- private EditText sealCode = null;
- private EditText sealMaterial = null;
- private EditText sealSize = null;
- private EditText companyMadedName = null;
- private EditText companyMadedTime = null;
- private EditText companyCheckedName = null;
- private NfcAdapter mAdapter;
- private PendingIntent mPendingIntent;
- private IntentFilter[] mFilters;
- private String[][] mTechLists;
- private static final int AUTH = 1;
- private static final int EMPTY_BLOCK_0 = 2;
- private static final int EMPTY_BLOCK_1 = 3;
- private static final int NETWORK = 4;
- private static final int NFC_OFF = 5;
- private static final int NFC_TYPE_ERROR = 6;
- private static final String TAG = "NfcDemo";
- private static boolean READ_LOCK = false;
- private void initView(){
- sealCompanyName = (EditText) this.findViewById(R.id.edittext_seal_company_name);
- sealName = (EditText) this.findViewById(R.id.edittext_seal_name);
- sealNumber = (EditText) this.findViewById(R.id.edittext_seal_number);
- sealTaxId = (EditText) this.findViewById(R.id.edittext_tax_id);
- sealCode = (EditText) this.findViewById(R.id.edittext_code);
- sealMaterial = (EditText) this.findViewById(R.id.edittext_seal_material);
- sealSize = (EditText) this.findViewById(R.id.edittext_seal_size);
- companyMadedName = (EditText) this.findViewById(R.id.edittext_company_maded_name);
- companyMadedTime = (EditText) this.findViewById(R.id.edittext_company_maded_time);
- companyCheckedName = (EditText) this.findViewById(R.id.edittext_company_checked_name);
- clearBtn = (Button) this.findViewById(R.id.clear_btn);
- clearBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- cleanData();
- }
- });
- }
- //清除数据信息
- private void cleanData(){
- sealCompanyName.setText("");
- sealName.setText("");
- sealNumber.setText("");
- sealTaxId.setText("");
- sealCode.setText("");
- sealMaterial.setText("");
- sealSize.setText("");
- companyMadedName.setText("");
- companyMadedTime.setText("");
- companyCheckedName.setText("");
- }
- @Override
- public void onCreate(Bundle savedState) {
- super.onCreate(savedState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- initView();
- mAdapter = NfcAdapter.getDefaultAdapter(this);
- mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
- // Setup an intent filter for all MIME based dispatches
- IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
- // try {
- // ndef.addDataType("*/*");
- // } catch (MalformedMimeTypeException e) {
- // throw new RuntimeException("fail", e);
- // }
- mFilters = new IntentFilter[] { ndef, };
- mTechLists = new String[][] { new String[] { MifareClassic.class
- .getName() } , new String[] {NfcA.class.getName()}};
- //得到是否检测到ACTION_TECH_DISCOVERED触发
- if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
- //处理该intent
- resolveIntentNfcA(getIntent());
- }
- }
- @Override
- public void onResume() {
- super.onResume();
- if (mAdapter!=null && (!mAdapter.isEnabled())) {
- showAlert(NFC_OFF, getString(R.string.error5));
- }
- if (mAdapter!=null) {
- mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
- mTechLists);
- }
- }
- @Override
- public void onNewIntent(Intent intent) {
- resolveIntentNfcA(intent);
- }
- @Override
- public void onPause() {
- super.onPause();
- if (mAdapter!=null){
- mAdapter.disableForegroundDispatch(this);
- }
- }
- void resolveIntentNfcA(Intent intent){
- if (READ_LOCK==false){
- READ_LOCK = true;
- Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()))
- {
- Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- MyLog.i(TAG, Arrays.toString(tagFromIntent.getTechList()));
- try
- {
- NfcA nfcA = NfcA.get(tag);
- nfcA.connect();
- byte[] SELECT = {
- (byte) 0x30,
- (byte) 0x05,
- };
- byte[] result = nfcA.transceive(SELECT);
- int data_len = ((result[0]&0x0f)<<8)+((result[1]&0xff));
- MyLog.i(TAG, "是否已写入数据"+result[0]+",写入数据长度:"+data_len);
- byte[] buf_res = new byte[data_len/2+4];
- if (result[0]!=0 && data_len!=0){
- int count = data_len/2/64;
- int i = 0;
- for (i=0; i<count; i++){
- // //读取数据
- byte[] DATA_READ = {
- (byte) 0x3A,
- (byte) (0x06+i*(64/4)),
- (byte) (0x06+(i+1)*(64/4))
- // (byte) (5+data_len/8)
- };
- byte[] data_res = nfcA.transceive(DATA_READ);
- System.arraycopy(data_res, 0, buf_res, i*64, 64);
- MyLog.i(TAG, "读卡成功");
- }
- if (((data_len/2)%(64))!=0){
- byte[]DATA_READ = {
- (byte) 0x3A,
- (byte) (0x06+i*(64/4)),
- (byte) (((0x06+i*(64/4))+(data_len/2/4)%(64/4))-1)
- // (byte) (5+data_len/8)
- };
- byte[] data_res = nfcA.transceive(DATA_READ);
- System.arraycopy(data_res, 0, buf_res, i*64, (data_len/2)%64);
- MyLog.i(TAG, "读卡成功2");
- }
- String res = gb2312ToString(buf_res);
- MyLog.i(TAG, "stringBytes:"+res);
- showNFCInfo(res);
- }
- }catch(IOException e){
- e.printStackTrace();
- cleanData();
- MyLog.e(TAG, "读卡失败");
- }catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- showAlert(NFC_TYPE_ERROR, getString(R.string.error6));
- }finally{
- }
- }
- READ_LOCK = false;
- }
- }
- //将数据转换为GB2312
- private String gb2312ToString(byte[] data) {
- String str = null;
- try {
- str = new String(data, "gb2312");//"utf-8"
- } catch (UnsupportedEncodingException e) {
- }
- return str;
- }
- //将字符串解析显示到页面
- private void showNFCInfo(String str){
- String[] contents_temp = str.split("\\|");
- String[] contents = new String[contents_temp.length];
- int i;
- for (i = 0; i < contents_temp.length; i++) {
- contents[i]=contents_temp[i];
- }
- //目前有10项,所以这里只初始化到第10项
- for (int j=i; j<10; j++){
- contents[j]="";
- }
- if (contents[0]!=null){
- sealCompanyName.setText(contents[0]);
- }
- if (contents[1]!=null){
- sealName.setText(contents[1]);
- }
- if (contents[2]!=null){
- sealNumber.setText(contents[2]);
- }
- if (contents[3]!=null){
- sealTaxId.setText(contents[3]);
- }
- if (contents[4]!=null){
- sealCode.setText(contents[4]);
- }
- if (contents[5]!=null){
- sealMaterial.setText(contents[5]);
- }
- if (contents[6]!=null){
- sealSize.setText(contents[6]);
- }
- if (contents[7]!=null){
- companyMadedName.setText(contents[7]);
- }
- if (contents[8]!=null){
- companyMadedTime.setText(contents[8]);
- }
- if (contents[9]!=null){
- companyCheckedName.setText(contents[9]);
- }
- }
- private void showAlert(int alertCase,String str) {
- // prepare the alert box
- AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
- switch (alertCase) {
- case AUTH:// Card Authentication Error
- alertbox.setMessage(getString(R.string.error1));
- break;
- case EMPTY_BLOCK_0: // Block 0 Empty
- alertbox.setMessage(getString(R.string.error2));
- break;
- case EMPTY_BLOCK_1:// Block 1 Empty
- alertbox.setMessage(getString(R.string.error3));
- break;
- case NETWORK: // Communication Error
- alertbox.setMessage(getString(R.string.error4));
- break;
- case NFC_OFF:
- alertbox.setMessage(getString(R.string.error5));
- break;
- case NFC_TYPE_ERROR:
- alertbox.setMessage(getString(R.string.error6));
- }
- // set a positive/yes button and create a listener
- alertbox.setPositiveButton("OK", new DialogInterface.OnClickListener() {
- // Save the data from the UI to the database - already done
- public void onClick(DialogInterface arg0, int arg1) {
- clearFields();
- }
- });
- // display box
- alertbox.show();
- }
- private void clearFields() {
- }
- }
读取NfcA格式数据的更多相关文章
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- R语言笔记001——读取csv格式数据
读取csv格式数据 数据来源是西南财经大学 司亚卿 老师的课程作业 方法一:read.csv()函数 file.choose() read.csv("C:\\Users\\Administr ...
- ArcGIS读取dem格式数据
DEM是GIS常用的一种数据,用来做各种分析.展示等,十分有用!它实质上就是一个栅格,只不过这个栅格值表示高程,常用的格式是tif,grid等.今天听到了另外一种说法:*.dem是最常见到的DEM的格 ...
- Pandas 读取文本格式数据
title 其实书中说的我认为不够全,因为公司里面现在主要用stata和spss,暂时还没有用到sas,excel也很少用 那么读取文件的方式,因为有人已经总结了,我就偷过来算了 对应不同的文件类型有 ...
- Java读取lob格式数据
想要读出lob里面的图片数据,就要确认clob里面存储的是什么,一般情况下存储的base64的串串.所以就以base64为例,而Blob里面存储的大部分是图片数据,但也有xml内容数据. 1查询lob ...
- C# 读取CSV格式数据 读取为DataTable类型
先贴代码: using System.Data;using System.Data.OleDb; static void Main(string[] args) { var strpath = Sys ...
- R语言XML格式数据导入与处理
数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强 ...
- 基于GDAL库,读取海洋风场数据(.nc格式)c++版
经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形.海洋表面温度.盐度.湿度.云场.风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据.本文将以海洋风场数据为例 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
随机推荐
- MAC地址与IP地址的区别
介绍一下MAC地址的知识,MAC地址和IP地址的区别以及MAC地址在实际应用中所涉及到的安全问题. 一.基础知识 如今的网络是分层来实现的,就像是搭积木一样,先设计某个特定功能的模块,然后把模块拼起来 ...
- 使用powershell提权的一些技巧
原文:http://fuzzysecurity.com/tutorials/16.html 翻译:http://www.myexception.cn/windows/1752546.html http ...
- Learn ZYNQ Programming(1)
GPIO LED AND KEY: part1:gpio leds and gpio btns combination. (include 1~4) part2:use gpio btns inter ...
- thinkphp的field方法的用法
ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model->fi ...
- SVN 的安装与配置
1.下载subclipse1.6的site包 2.把这个site-1.6.2解压开,将其内部的文件,全部放到 C:\Program Files\MyEclipse\MyEclipse 9\dropin ...
- ffmpeg命令行
ubuntu下简单安装ffmpeg sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-nextsudo apt-get update sudo a ...
- IOS第17天(1,Quartz2D图片水印)
****图片 水印 #import "HMViewController.h" @interface HMViewController () @property (weak, non ...
- File类的createNewFile()与createTempFile()的区别
最近,在看代码时看到了一个方法, File.createTempFile() ,由此联想到File.createNewFile() 方法,一时间不知道两者到底有什么区别,感觉都是创建新文件嘛,后来查看 ...
- 怎样成为全栈工程师(Full Stack Developer)?
"Facebook 工程师说 Facebook 只招 full stack engineer,那么 Facebook engineer 都是怎样的人啦."? 具体经验不重要,重要的 ...
- eclipse创建web项目
总结为3步: 必备环境: Eclipse jee Tomcat 1.创建services 2.创建dynamic web project项目 3.WebContent路径下创建index.jsp 运行 ...