NFC(11)MifareUltralight格式规范及读写示例
注意
MifareUltralight 不支三种过滤方式之一,只支持第四种(用代码,activity singleTop )
见 NFC(4)响应NFC设备时启动activity的四重过滤机制
MifareUltralight数据格式规范
将NFC标签的存储区域分为16个页,每一个页可以存储4个字节,一个可存储64个字节(512位)。页码从0开始(0至15)。前4页(0至3)存储了NFC标签相关的信息(如NFC标签的序列号、控制位等)。从第5页开始存储实际的数据(4至15页)。
示例代码:
import java.nio.charset.Charset; import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.Toast; /*
* 本类为处理MifareUltralighto格式nfc标签的aty
*/
public class MifareultralightMainActivity extends Activity { private CheckBox mWriteData;
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_mifareultralight);
mWriteData = (CheckBox) findViewById(R.id.checkbox_write); //1,设置当前窗口为处理nfc标签的窗口.
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mPendingIntent = PendingIntent.getActivity(this, , new Intent(this,getClass()), );
} /*
* 2,注册为处理nfc标签的前台窗口
*/
@Override
public void onResume() {
super.onResume();
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null,null);
}
}
@Override
public void onNewIntent(Intent intent) {
//得到nfc标签.
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //得到nfc标签内支持的数据格式,如ndef,MifareUltralight
String[] techList = tag.getTechList(); //判断是否支持MifareUltralight数据格式
boolean haveMifareUltralight = false;
for (String tech : techList) {
if (tech.indexOf("MifareUltralight") >= ) {
haveMifareUltralight = true;
break;
}
}
if (!haveMifareUltralight) {//标签不支持MifareUltralight数据格式
Toast.makeText(this, "本标签不支持MifareUltralight数据格式",Toast.LENGTH_LONG).show();
return;
}
if (mWriteData.isChecked()) {
//3,写数据
writeTag(tag);
} else {
//4,读数据
String data = readTag(tag);
if (data != null)
Toast.makeText(this, data, Toast.LENGTH_LONG).show();
} }
/*
*5,注销处理nfc标签的窗口
*/
@Override
public void onPause() {
super.onPause();
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
}
}
/*
* 向nfc标签写入数据
* 将NFC标签的存储区域分为16个页,每一个页可以存储4个字节,一个可存储64个字节(512位)。
* 页码从0开始(0至15)。前4页(0至3)存储了NFC标签相关的信息(如NFC标签的序列号、控制位等)。
* 从第5页开始存储实际的数据(4至15页)。
*/
public void writeTag(Tag tag) {
//向nfc标签写数据第1步,从标签中得到MifareUltralight
MifareUltralight ultralight = MifareUltralight.get(tag);
try {
//向nfc标签写数据第2步, connect
ultralight.connect(); /*
* 向nfc标签写数据第3步, 正式写数据.前4页(0至3)存储了NFC标签相关的信息
*
* 注意 Charset.forName("GB2312")),
* 不用utf-8因为一个汉字有可能用3个字节编码汉字,那么2个汉字有可能是6个字节.
* 而GB2312始终用2个字节.而每页最多4个字节,
*/
ultralight.writePage(, "中国".getBytes(Charset.forName("GB2312")));//第4页,页从0开始.
ultralight.writePage(, "美国".getBytes(Charset.forName("GB2312")));
ultralight.writePage(, "英国".getBytes(Charset.forName("GB2312")));
ultralight.writePage(, "德国".getBytes(Charset.forName("GB2312"))); Toast.makeText(this, "成功写入MifareUltralight格式数据",Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ultralight.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* 读取MifareUltralight格式数据
*/
public String readTag(Tag tag) {
//读数据 第1步,从nfc标签中得到MifareUltralight
MifareUltralight ultralight = MifareUltralight.get(tag); try {
//读数据 第2步,接连
ultralight.connect();
//读数据 第3步,从ultralight数据中的下标为4的位开始读数据.
byte[] data = ultralight.readPages();
//读数据 第4步,把读出的数据存到一个string中.注意语言编码
return new String(data, Charset.forName("GB2312"));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ultralight.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
NFC(11)MifareUltralight格式规范及读写示例的更多相关文章
- NFC(10)NDEF uri格式规范及读写示例(解析与封装ndef uri)
只有遵守NDEF uri 格式规范的数据才能写到nfc标签上. NDEF uri 格式规范 uri 只有两部分: 第1个字节是uri协议映射值,如:0x01 表示uri以 http://www.开头. ...
- NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)
只有遵守NDEF文本格式规范的数据才能写到nfc标签上. NDEF文本格式规范 不管什么格式的数据本质上都是由一些字节组成的.对于NDEF文本格式来说. 1,这些数据的第1个字节描述了数据的状态, 2 ...
- android nfc中MifareClassic格式的读写
Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-dat ...
- RSS介绍、RSS 2.0规范说明和示例代码
RSS是一种消息来源格式规范,用以发布经常更新资料的网站,例如博客.新闻的网摘.RSS文件,又称做摘要.网摘.更新.频道等,包含了全文或节选文字,再加上一定的属性数据.RSS让发布者自动发布信息,也使 ...
- OverWatch团队文档格式规范
V1.0 最终修改于2016/10/19 概述 软件工程中,一份优雅的文档不仅能降低团队成员之间的沟通难度,而且能给之后的开发者提供一个非常有效的引导.本团队为了规范整个项目中文档的格式,便于统一管理 ...
- WEB学习笔记4-前端代码基本命名规法和格式规范
1.HTML命名规范及格式规范 标签名和属性应该都小写,虽然HTML代码不区分大小写:属性值应该用双引号闭合. <IMG src=demo.jpg alt='test'/>(N) < ...
- 理解CSV格式规范(解析CSV必备)
什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...
- GeoJSON格式规范说明
GeoJSON格式规范说明 1.简介 GeoJSON是一种对各种地理数据结构进行编码的格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点.线.面.多点.多线.多 ...
- IOS格式规范
IOS格式规范 目录 概述 日期格式 NSDateFormatter格式说明 概述 日期格式 声明时间格式:NSDateFormatter *date_formatter = [[NSDateForm ...
随机推荐
- XML美化工具及其他各种美化工具
在线工具 http://www.ostools.net/codeformat/xml 3464网页常用工具 http://www.3464.com/Tools/CodeFormat/ 在线工具大全 h ...
- Oracle 动态视图1 V$LOCK
v$lock显示数据库当前持有锁情况 Column Datatype Description SID NUMBER 会话ID TYPE VARCHAR2(2) 表示锁的类型.值包括TM,TX,等 ID ...
- PhantomJS实现最简单的模拟登录方案
以前写爬虫,遇到需要登录的页面,一般都是通过chrome的检查元素,查看登录需要的参数和加密方法,如果网站的加密非常复杂,例如登录qq的,就会很蛋疼 在后面,有了Pyv8,就可以把加密的js文件扔给它 ...
- Nginx upstream的5种权重分配方式
.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器down掉,能自动剔除 .weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. upstre ...
- Xcode常用设置
1.设置主题和字体大小 2.设置显示代码行号
- Experience all that SharePoint 15 has to offer. Start now or Remind me later.
$spSite = Get-SpSite($waUrl); $spSite.AllowSelfServiceUpgrade = $false
- MyEcpilise引入Maven项目目录不正常,无JRE,无Maven Dependencies
右键项目--> Maven4MyEclipse --> Update Project Configuration
- C#学习笔记---基础入门(二)
枚举 枚举是被命名的整型常数的集合:枚举类型的变量只有赋值后才能使用:不同枚举中的枚举值可以重名:可以自定义枚举值. enum Playstates { 跑, 跳,下滑,左转,右 ...
- 1048: [HAOI2007]分割矩阵 - BZOJ
Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了 ...
- 你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?
你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对? 你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算 ...