package skyseraph.android.util.nfc;

 import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap; import skyseraph.android.util.LogUtil;
import skyseraph.android.util.MyConstant; import android.annotation.SuppressLint;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord; import java.nio.charset.Charset;
import java.util.Locale; /**
* @Title :BobNdefMessage.java
* @Package :skyseraph.android.util.nfc
* @ClassName : BobNdefMessage
* @Description :Custom Class For NdefMessage
* @author : skyseraph00@163.com
* @date : 2013-5-13 上午11:14:51
* @version : V1.0 《Android NFC 开发实战详解》
*/
public class BobNdefMessage {
private static final String TAG_ASSIST = "[BobNdefMessage]-"; /**
* @About:create a TNF_WELL_KNOW NDEF record as RTD_URI
* @param uriFiledStr , The rest of the URI, or the entire URI (if
* identifier code is 0x00).
* @param identifierCode = prefixes(URI identifier code), 0x01=http://www.
* ,0x02=https://www. , 0x03=http://
* @param flagAddAAR, true means add AAR
* @return NdefMessage
* @Ref: NFCForum-TS-RTD_URI_1.0
* @By SkySeraph-2013
*/
public static NdefMessage getNdefMsg_from_RTD_URI(String uriFiledStr, byte identifierCode,
boolean flagAddAAR) {
LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_RTD_URI");
byte[] uriField = uriFiledStr.getBytes(Charset.forName("US-ASCII"));
byte[] payLoad = new byte[uriField.length + 1]; // add 1 for the URI
// Prefix
payLoad[0] = identifierCode; // 0x01 = prefixes http://www. to the URI
// appends URI to payload
System.arraycopy(uriField, 0, payLoad, 1, uriField.length); // Method1:
NdefRecord rtdUriRecord1 = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
new byte[0], payLoad); // Method2:only in API 14
String prefix = URI_PREFIX_MAP.get(identifierCode);
NdefRecord rtdUriRecord2 = NdefRecord.createUri(prefix + uriFiledStr); // Method3:only in API 14
NdefRecord rtdUriRecord3 = NdefRecord.createUri(Uri.parse(prefix + uriFiledStr)); if (flagAddAAR) {
// note: returns AAR for different app (nfcreadtag)
return new NdefMessage(new NdefRecord[] {
rtdUriRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
}); // packageName
} else {
return new NdefMessage(new NdefRecord[] {
rtdUriRecord1
});
}
} /**
* @About:create a TNF_WELL_KNOW NDEF record as RTD_TEXT
* @param text , the really text data
* @param encodeInUtf8 , false means TEXT encoded by UTF-8
* @param flagAddAAR , true means add AAR
* @return NdefMessage
* @Ref: NFCForum-TS-RTD_Text_1.0
* @By SkySeraph-2013
*/
public static NdefMessage getNdefMsg_from_RTD_TEXT(String text, boolean encodeInUtf8,
boolean flagAddAAR) {
LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_RTD_TEXT"); Locale locale = new Locale("en", "US"); // a new Locale is created with
// US English.
byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
// boolean encodeInUtf8 = false;
Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
int utfBit = encodeInUtf8 ? 0 : (1 << 7);
char status = (char)(utfBit + langBytes.length);
// String text = "This is an RTD_TEXT exp";
byte[] textBytes = text.getBytes(utfEncoding);
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);
NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT,
new byte[0], data); if (flagAddAAR) {
// note: returns AAR for different app (nfcreadtag)
return new NdefMessage(new NdefRecord[] {
textRecord, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
});
} else {
return new NdefMessage(new NdefRecord[] {
textRecord
});
}
} /**
* @About: create a TNF_ABSOLUTE_URI NDEF record
* @param absoluteUri ,the absolute Uri
* @param flagAddAAR , true means add AAR
* @return NdefMessage
* @Note: TNF_ABSOLUTE_URI indicates the absolute form of a URI that follows
* the absolute-URI rule defined by RFC 3986
* @Note: Recommend that you use the RTD_URI type instead of
* TNF_ABSOLUTE_URI, because it is more efficient
* @By SkySeraph-2013
*/
public static NdefMessage getNdefMsg_from_ABSOLUTE_URI(String absoluteUri, boolean flagAddAAR) {
LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_ABSOLUTE_URI");
// String absoluteUri = "http://developer.android.com/index.html";
byte[] absoluteUriBytes = absoluteUri.getBytes(Charset.forName("US-ASCII"));
NdefRecord uriRecord = new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, absoluteUriBytes,
new byte[0], new byte[0]);
if (flagAddAAR) {
// note: returns AAR for different app (nfcreadtag)
return new NdefMessage(new NdefRecord[] {
uriRecord, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
});
} else {
return new NdefMessage(new NdefRecord[] {
uriRecord
});
}
} /**
* @About:create a TNF_MIME_MEDIA NDEF record
* @param payLoad,the MIME data
* @param mimeType,the MIME Type
* @param flagAddAAR, true means add AAR
* @return NdefMessage
* @By SkySeraph-2013
*/
@SuppressLint("NewApi")
public static NdefMessage getNdefMsg_from_MIME_MEDIA(String payLoad, String mimeType,
boolean flagAddAAR) {
LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_MIME_MEDIA");
byte[] payLoadBytes = payLoad.getBytes(Charset.forName("US-ASCII"));
// String mimeType = "application/skyseraph.nfc_demo"; // method1:Creating the NdefRecord manually
NdefRecord mimeRecord1 = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
mimeType.getBytes(Charset.forName("US-ASCII")), new byte[0], payLoadBytes);
// the identfier of the record is given as 0, since it will be the first
// record in the NdefMessage // method2:Using the createMime() method, in API-16
NdefRecord mimeRecord2 = NdefRecord.createMime(mimeType, payLoadBytes); if (flagAddAAR) {
// note: returns AAR for different app (nfcreadtag)
return new NdefMessage(new NdefRecord[] {
mimeRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
});
} else {
return new NdefMessage(new NdefRecord[] {
mimeRecord1
});
}
} /**
* @About:create a TNF_EXTERNAL_TYPE NDEF record
* @param payLoad,the EXTERNAL data
* @param flagAddAAR, true means add AAR
* @return NdefMessage
* @By SkySeraph-2013
*/
@SuppressLint("NewApi")
public static NdefMessage getNdefMsg_from_EXTERNAL_TYPE(String payLoad, boolean flagAddAAR) {
LogUtil.i(MyConstant.TAG, TAG_ASSIST + "into getNdefMsg_from_EXTERNAL_TYPE");
byte[] payLoadBytes = payLoad.getBytes();
String domain = "skyseraph.nfc_demo"; // usually your app's package name
String type = "externalType";
String externalType = domain + ":" + type; // method1:Creating the NdefRecord manually
NdefRecord exteralRecord1 = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
externalType.getBytes(), new byte[0], payLoadBytes); // method2:Using the createExternal() method, in API-16
NdefRecord exteralRecord2 = NdefRecord.createExternal(domain, type, payLoadBytes); if (flagAddAAR) {
// note: returns AAR for different app (nfcreadtag)
return new NdefMessage(new NdefRecord[] {
exteralRecord1, NdefRecord.createApplicationRecord("skyseraph.nfc_demo")
});
} else {
return new NdefMessage(new NdefRecord[] {
exteralRecord1
});
}
} /**
* checkSystemVersion()
*/
private boolean flagVersion = false; private void checkSystemVersion() {
// TODO Auto-generated method stub
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) LogUtil.i(MyConstant.TAG, TAG_ASSIST + "Product Model=" + android.os.Build.MODEL + ", "
+ android.os.Build.VERSION.SDK + ", " + android.os.Build.VERSION.RELEASE);
String systemModel;
String releaseVersion;
String sdkVersion;
systemModel = android.os.Build.MODEL;
sdkVersion = android.os.Build.VERSION.SDK;
releaseVersion = android.os.Build.VERSION.RELEASE;
if (Integer.parseInt(sdkVersion) > 15) {
flagVersion = true;
} else {
flagVersion = false;
LogUtil.e(MyConstant.TAG, TAG_ASSIST + "Your android system version is low to API-16");
}
} /**
* NFC Forum "URI Record Type Definition" This is a mapping of
* "URI Identifier Codes" to URI string prefixes, per section 3.2.2 of the
* NFC Forum URI Record Type Definition document.
*/
private static final BiMap<Byte, String> URI_PREFIX_MAP = ImmutableBiMap
.<Byte, String> builder().put((byte)0x00, "").put((byte)0x01, "http://www.")
.put((byte)0x02, "https://www.").put((byte)0x03, "http://").put((byte)0x04, "https://")
.put((byte)0x05, "tel:").put((byte)0x06, "mailto:")
.put((byte)0x07, "ftp://anonymous:anonymous@").put((byte)0x08, "ftp://ftp.")
.put((byte)0x09, "ftps://").put((byte)0x0A, "sftp://").put((byte)0x0B, "smb://")
.put((byte)0x0C, "nfs://").put((byte)0x0D, "ftp://").put((byte)0x0E, "dav://")
.put((byte)0x0F, "news:").put((byte)0x10, "telnet://").put((byte)0x11, "imap:")
.put((byte)0x12, "rtsp://").put((byte)0x13, "urn:").put((byte)0x14, "pop:")
.put((byte)0x15, "sip:").put((byte)0x16, "sips:").put((byte)0x17, "tftp:")
.put((byte)0x18, "btspp://").put((byte)0x19, "btl2cap://").put((byte)0x1A, "btgoep://")
.put((byte)0x1B, "tcpobex://").put((byte)0x1C, "irdaobex://")
.put((byte)0x1D, "file://").put((byte)0x1E, "urn:epc:id:")
.put((byte)0x1F, "urn:epc:tag:").put((byte)0x20, "urn:epc:pat:")
.put((byte)0x21, "urn:epc:raw:").put((byte)0x22, "urn:epc:")
.put((byte)0x23, "urn:nfc:").build();
}

Easy Tag Write(2)的更多相关文章

  1. Easy Tag Write(3.3)

    package skyseraph.android.util; /** * @Title : Constant.java * @Package : tcl.nfc.tv.util * @ClassNa ...

  2. Easy Tag Write(3.2)

    package skyseraph.android.util; /** * @Title : LogUtil.java * @Package : tcl.nfc.phone.util * @Class ...

  3. Easy Tag Write(1)

    package skyseraph.easytagwrite; import skyseraph.android.util.CustomDialog; import skyseraph.android ...

  4. Easy Tag Write(3.1)

    package skyseraph.android.util; import skyseraph.easytagwrite.R; import android.app.Dialog; import a ...

  5. [LeetCode] 70. Climbing Stairs_ Easy tag: Dynamic Programming

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  6. [LeetCode] 437. Path Sum III_ Easy tag: DFS

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] 257. Binary Tree Paths_ Easy tag: DFS

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  8. [LeetCode] 101. Symmetric Tree_ Easy tag: BFS

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  9. JUnit5学习之五:标签(Tag)和自定义注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. 摸索探寻之Mac OS 使用及快捷键

    刚发现的一个介绍Mac OS入门的帖子,新入手Mac的同学可以看看http://www.cnblogs.com/chijianqiang/archive/2011/08/03/2126593.html ...

  2. [我的试题]Test of String

    1.前言 这是我出的第一套题目,话说感觉有点晚了,还是在向总安排下出的.我被安排的是字符串方面的内容,这应该相对而言是比较小众的知识点吧,但是一样的有作用的,也有很神的题目.所谓是NOIP模拟题,其实 ...

  3. 【Linux】df命令 ,查看磁盘容量。

    Oracle 导库时,失败,原因为磁盘满了, 记录下查看磁盘容量的指令 1.命令格式: df [选项] [文件] -a 全部文件系统列表 -h 方便阅读方式显示 -H 等于“-h”,但是计算式,1K= ...

  4. BZOJ1453: [Wc]Dface双面棋盘

    Description Input Output Sample Input Sample Output HINT 线段树套并查集应该是比较好写的做法,时间复杂度为O(N^3+M*NlogN). #in ...

  5. 初用idea建立javaweb遇到的问题与心得

    1.直接用idea建立的web项目,其自动生成的web.xml里version=3.1,这样的话建立servlet-name等标签会报错(因为3.1不支持这种做法,更提倡用注解的办法),解决办法是将w ...

  6. bzoj1720: [Usaco2006 Jan]Corral the Cows 奶牛围栏

    金组题什么的都要绕个弯才能AC..不想银组套模板= = 题目大意:给n个点,求最小边长使得此正方形内的点数不少于c个 首先一看题就知道要二分边长len 本来打算用二维前缀和来判断,显然时间会爆,而且坐 ...

  7. 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎

    战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...

  8. ssh的原理和流程

    一.strtus:第1步:把上面的jar包下载完成后,先在eclipse中新建一个web工程,新建工程的同时最好选上创建的同时添加web.xml文件 第2步:找到下载并解压好的strtus文件中找到a ...

  9. Java命令行解析:apache commons-cli

    http://commons.apache.org/proper/commons-cli/usage.html Apache Commons CLI用于解析命令行选项,也可以输出详细的选项说明信息. ...

  10. hive 使用where条件报错 java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode

    hadoop 版本 2.6.0 hive版本 1.1.1 错误: java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalk ...