读取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": ...
随机推荐
- Unity UGUI HUD 怪物血条实现
首先做一个血条,创建一个名为Follow3DObject的脚本添加到血条控件上. Follow3DObject.cs的代码如下: using UnityEngine; using System.Col ...
- 20145334实验三《敏捷开发与XP实践》
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 1.敏捷开发与XP 敏捷开发(Agile Dev ...
- 安装好php后,配置httpd以便支持php3脚本
Apache是目前应用最广的Web服务器,PHP是一种类似ASP的易学的脚本语言,而且性能和功能都比ASP要强,而MySQL又是一个Linux上应用最多的数据库系统,特别是用于网站建设,这3个软件均是 ...
- Android课程---Android Studio的一些小技巧
APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于一些维护很久的老项目比较有用,里面有很多无效的Resource, 删 ...
- 【iCore3 双核心板_ uC/OS-III】例程三:任务的挂起与恢复
实验指导书及代码包下载: http://pan.baidu.com/s/1jIctRVo iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- javascript大神修炼记(7)——OOP思想(多态)
读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给j ...
- Mysql VARCHAR(X) vs TEXT
一般情况下,我们不太会纠结用Varchar或text数据类型. 比如说,我们要存储邮箱,我们自然会用varchar,不会想到用text.而当我们要存储一段话的时候,选了text,感觉varchar也够 ...
- Box2D淌坑日记: 如何正确的设置角度
对刚体角度设置的唯一函数是 SetTransform 然而,这个函数不会对传入的角度作任何处理,因此,如果你试图设置一个角度,并应用一个revoluteJoint时,可能会出现问题. 我在实践中碰到的 ...
- Android开发常见问题系列之一:eclipse中adb.exe启动失败或者无法启动
这种情况下大多数是因为存在kadb.exe在执行,或者adb.exe端口被占用. 1,检查是否存在kadb.exe程序正在执行 打开任务管理器,打开详细信息,按照字母顺序找到kadb.exe,结束进程 ...
- 升级到Xcode6.2后 免证书真机调试出错的问题
我的本来是Xcode6.1 可以正常免证书真机调试,升级到Xcode6.2以后,真机调试就报错,然后就又按照这篇文章http://www.cnblogs.com/liuliuliu/p/4030524 ...