NFC应用实例

package com.example.mynfcdemon;

import android.app.Activity;
import android.nfc.NfcAdapter;
import android.os.Bundle;

public class MainActivity extends Activity {


//private NfcAdapter nfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//nfcAdapter = NfcAdapter.getDefaultAdapter(this);
//运行APK 把标签靠近识别区即可。

}

-------------------------------

package com.example.mynfcdemon;

import java.io.IOException;

import android.nfc.tech.NfcV;

public class NfcVUtil {
private NfcV mNfcV;
//UID数组行式
private byte[] ID;
private String UID;
private String DSFID;
private String AFI;
//block的个数
private int blockNumber;
//一个block长度
private int oneBlockSize;
//信息
private byte[] infoRmation;


/*@function :初始化
@param :mNfcV NfcV对象
@return :返回内容byte[]
@author: :Demon 503536038@qq.com
*/

public NfcVUtil(NfcV mNfcV) throws IOException{
this.mNfcV = mNfcV;
ID = this.mNfcV.getTag().getId();
byte[] uid = new byte[ID.length];
int j = 0;
for(int i = ID.length - 1; i>=0; i-- ){
uid[j] = ID[i];
j++;
}
this.UID = printHexString(uid);

getInfoRmation();

System.out.println("UID:" + getUID()
+"AFI:" + getAFI()
+"DSFID:" + getDSFID()
+"BlockNumber:" + getBlockNumber()
+"BlockSize:" + getOneBlockSize());
}

public String getUID() {
return UID;
}

/*@function :取得标签信息
@return :返回内容byte[]
@author: :Demon 503536038@qq.com
*/
private byte[] getInfoRmation() throws IOException{
byte[] cmd = new byte[10];
cmd[0] = (byte) 0x22; //flag
cmd[1] = (byte) 0x2B; //command
System.arraycopy(ID, 0, cmd, 2, ID.length); // UID
infoRmation = mNfcV.transceive(cmd);
blockNumber = infoRmation[12];
oneBlockSize = infoRmation[13];
AFI = printHexString(new byte[]{infoRmation[11]});
DSFID = printHexString(new byte[]{infoRmation[10]});
return infoRmation;
}


public String getDSFID() {
return DSFID;
}


public String getAFI() {
return AFI;
}
public int getBlockNumber(){
return blockNumber + 1;
}


public int getOneBlockSize() {
return oneBlockSize + 1;
}

/*@function :读取一个位置在position的block
@param :position 要读取的block位置
@return :返回内容字符串
@author: :Demon 503536038@qq.com
*/
public String readOneBlock(int position) throws IOException{
byte cmd[] = new byte[11];
cmd[0] = (byte) 0x22;
cmd[1] = (byte) 0x20;
System.arraycopy(ID, 0, cmd, 2, ID.length); //UID
cmd[10] = (byte) position;
byte res[] = mNfcV.transceive(cmd);

for(int i=0; i < res.length; i++){

System.out.println("/" + res[i]);
}
String r = new String(res);
System.out.println("/" + r);

if(res[0] == 0x00){
byte block[] = new byte[res.length - 1];
System.arraycopy(res, 1, block, 0, res.length - 1);

//return printHexString(block);

String blockstr = new String(block);
return blockstr;
}
return null;
}

/*@function :读取从begin开始end个block
@instructions :begin + count 不能超过blockNumber
@param :begin block开始位置
@param :count 读取block数量
@return :返回内容字符串
@author: :Demon 503536038@qq.com
*/
public String readBlocks(int begin, int count) throws IOException{
if((begin + count)>blockNumber){
count = blockNumber - begin;
}
StringBuffer data = new StringBuffer();

for(int i = begin; i<=count + begin; i++){
data.append(readOneBlock(i));
}
return data.toString();

}

/* 将byte[]转换成16进制字符串
@param data 要转换成字符串的字节数组
@return 16进制字符串
*/
private String printHexString(byte[] data) {
StringBuffer s = new StringBuffer();;
for (int i = 0; i < data.length; i++) {
String hex = Integer.toHexString(data[i] & 0xFF);

if (hex.length() == 1) {
hex = '0' + hex;
}
s.append(hex);
}
return s.toString();
}

/* 将数据写入到block,
@param position 要写内容的block位置
@param data 要写的内容,必须长度为blockOneSize
@return false为写入失败,true为写入成功
@throws IOException */
public boolean writeBlock(int position, byte[] data) throws IOException{
byte cmd[] = new byte[15];
cmd[0] = (byte) 0x22;
cmd[1] = (byte) 0x21;
System.arraycopy(ID, 0, cmd, 2, ID.length);// UID
//block
cmd[10] = (byte) position;
//value
System.arraycopy(data, 0, cmd, 11, data.length);
byte[]rsp = mNfcV.transceive(cmd);
if(rsp[0] == 0x00){
return true;
}

return false;
}

public boolean writeStrToTag(String str){


return false;

}


}

---------------------------------

package com.example.mynfcdemon;

import java.io.IOException;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.NfcV;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;

public class TagView extends Activity{

// NFC parts
private static NfcAdapter mAdapter;
private static PendingIntent mPendingIntent;
private static IntentFilter[] mFilters;
private static String[][] mTechLists;

private TextView texttagid;
private TextView texttagdata;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.tag_vierwr);
texttagdata = (TextView) findViewById(R.id.tagdatatext);
texttagid = (TextView) findViewById(R.id.tagidtext);

mAdapter = NfcAdapter.getDefaultAdapter(this);
// Create a generic PendingIntent that will be deliver to this activity.
// The NFC stack
// will fill in the intent with the details of the discovered tag before
// delivering to
// this activity.
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, };

// Setup a tech list for all NfcV tags
mTechLists = new String[][] { new String[] { NfcV.class.getName() } };

try {
rfid_scanresult(getIntent());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

void rfid_scanresult(Intent intent) throws IOException{

String action = intent.getAction();
if(NfcAdapter.ACTION_NDEF_DISCOVERED == action
|| NfcAdapter.ACTION_TECH_DISCOVERED == action
|| NfcAdapter.ACTION_TAG_DISCOVERED == action){
//if(NfcAdapter.ACTION_TECH_DISCOVERED == action){
//byte[] tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] tagid = tag.getId();
//String strid = new String(tagid);
//System.out.println("TAGID:"+strid);
//System.out.println("TAGID:"+bytesToHexString(tagid));
//texttagid.setText("TagID=" + bytesToHexString(tagid));

Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcV nfcv = NfcV.get(tagFromIntent);
nfcv.connect();
NfcVUtil mNfcVutil = new NfcVUtil(nfcv);

texttagid.setText("UID:" + mNfcVutil.getUID()+' '
+"AFI:" + mNfcVutil.getAFI()+' '
+"DSFID:" + mNfcVutil.getDSFID()+' '
+"BlockNumber:" + mNfcVutil.getBlockNumber()+' '
+"BlockSize:" + mNfcVutil.getOneBlockSize());
//NfcVClassCard mifareClassCard=null;
texttagdata.setText("block0:"+mNfcVutil.readOneBlock(0)
+"block1:"+mNfcVutil.readOneBlock(1)+' '
+"block2:"+mNfcVutil.readOneBlock(2)
+"block3:"+mNfcVutil.readOneBlock(3)+' '
+"block4:"+mNfcVutil.readOneBlock(4)
+"block5:"+mNfcVutil.readOneBlock(5)+' '
+"block6:"+mNfcVutil.readOneBlock(6)
+"block7:"+mNfcVutil.readOneBlock(7)+' '
+"block8:"+mNfcVutil.readOneBlock(8)
+"block9:"+mNfcVutil.readOneBlock(9)+' '
+"block10:"+mNfcVutil.readOneBlock(10)
+"block11:"+mNfcVutil.readOneBlock(11)+' '
+"block12:"+mNfcVutil.readOneBlock(12)
+"block13:"+mNfcVutil.readOneBlock(13)+' '
+"block14:"+mNfcVutil.readOneBlock(14)
+"block15:"+mNfcVutil.readOneBlock(15)+' '
+"block16:"+mNfcVutil.readOneBlock(16)
+"block17:"+mNfcVutil.readOneBlock(17)+' '
+"block18:"+mNfcVutil.readOneBlock(18)
+"block19:"+mNfcVutil.readOneBlock(19)+' '
+"block20:"+mNfcVutil.readOneBlock(20)
+"block21:"+mNfcVutil.readOneBlock(21)+' '
+"block22:"+mNfcVutil.readOneBlock(22)
+"block23:"+mNfcVutil.readOneBlock(23)+' '
+"block24:"+mNfcVutil.readOneBlock(24)
+"block25:"+mNfcVutil.readOneBlock(25)+' '
+"block26:"+mNfcVutil.readOneBlock(26)
+"block27:"+mNfcVutil.readOneBlock(27)+' '
+"Read:"+ mNfcVutil.readBlocks(0, 28)
);
/*String str;
str = getNdefMessages(intent).toString();

System.out.println("Ndef::"+str);*/
String s = "kaic";
mNfcVutil.writeBlock(0, s.getBytes());

}


}

NdefMessage[] getNdefMessages(Intent intent) {
// Parse the intent
NdefMessage[] msgs = null;
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs =intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
else {
// Unknown tag type
byte[] empty = new byte[] {};
NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty,empty);
NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
msgs = new NdefMessage[] {msg};
}
}
else {
// Log.e(TAG, "Unknown intent " + intent);
finish();
}
return msgs;
}

void write_NdefFormatableTag(){
/*NdefFormatable tag = NdefFormatable.get(t);
Locale locale = Locale.US;
final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);
String text = "Tag, you're it!";
final byte[] textBytes = text.getBytes(Charsets.UTF_8);
final int utfBit = 0;
final char status = (char) (utfBit + langBytes.length);
final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes);
NdefRecord record = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, newbyte[0], data);
try {
NdefRecord[] records = {text};
NdefMessage message = new NdefMessage(records);
tag.connect();
tag.format(message);
}
catch (Exception e){
//do error handling
}*/

}



public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}

}

原文地址:https://www.cnblogs.com/qiaoxu/p/3989903.html