您的位置:首页 > 移动开发 > Android开发

Android 使用NFC通过标签协议栈读写标签数据

2015-07-15 09:59 162 查看
欢迎转载,转载请注明出处:http://blog.sina.com.cn/s/blog_821e2bb10101fu1h.html

前言:最近项目需要向标签里读取与写入数据,于是研究了下Android的 NFC技术,刚开始在网上找资料,感觉不是很复杂,但后来发现项目操作的标签格式不是NDEF数据格式类型的,要用原协议栈进行读写,这里以15693协议的标签为例。



源码:

import java.io.IOException;

import android.app.Activity;

import android.app.PendingIntent;

import android.content.Intent;

import android.content.IntentFilter;

import android.nfc.NfcAdapter;

import android.nfc.Tag;

import android.nfc.TagLostException;

import android.nfc.tech.NfcV;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

public class mainActivity extends Activity {

private NfcAdapter mAdapter;

private PendingIntent mPendingIntent;

private IntentFilter[] mFilters;

private String[][] mTechLists;

private TextView mText;

private int mCount = 0;

private NfcV nfcv=null;

@Override

public void onCreate(Bundle savedState) {

super.onCreate(savedState);



setContentView(R.layout.main);

mText = (TextView) findViewById(R.id.TextView);

mText.setText("扫描标签");



mAdapter = NfcAdapter.getDefaultAdapter(this);

mPendingIntent = PendingIntent.getActivity(this, 0,

new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);



IntentFilter nfcv= new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);

mFilters = new IntentFilter[] { nfcv};

mTechLists = new String[][] { new String[] {NfcV.class.getName()} };

}



@Override

public void onResume() {

super.onResume();

mAdapter.enableForegroundDispatch(this,mPendingIntent, mFilters, mTechLists);

}



@Override

public void onNewIntent(Intent intent) {

// Log.d("intent", "intent action="+intent.getAction());

if(intent.getAction().trim().equals("android.nfc.action.TECH_DISCOVERED")){

Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

// Log.d("intent", "intent tag="+NfcAdapter.EXTRA_TAG+", "+NfcAdapter.EXTRA_ID);

nfcv=NfcV.get(tagFromIntent);

byte[] UID=tagFromIntent.getId();

String[] techlist=tagFromIntent.getTechList();

StringBuilder stringbuilder1=new StringBuilder();

for(int i=0;i

stringbuilder1.append(techlist[i]+"\n");

}

int length=UID.length;

byte[] UID_zan=new byte[8];

byte[] uidShow=new byte[8];

for(int i=0;i

UID_zan[i]=UID[i];

}

for(int i=0;i

uidShow[length-i-1]=UID_zan[i];

}

mText.setText(Convert.bytesToHexString(uidShow)+"\n"+UID.length+"\n"+stringbuilder1.toString());



// //读数据

try {

if(nfcv.isConnected())

nfcv.close();

nfcv.connect();

byte[] command=new byte[11];

byte[] responsebyte = null;

command[0]=(byte)0x22; //标志位

command[1]=(byte)0x20; //命令位

System.arraycopy(UID, 0, command, 2, UID.length);

command[10]=(byte)0x1;

try{

responsebyte=nfcv.transceive(command);

}catch(TagLostException e){

e.printStackTrace();

}

if(responsebyte!=null){

String data=Convert.bytesToHexString(responsebyte);

Log.d("intent", "intent response="+Convert.toStringHex(data.substring(2, data.length())));

}

else

Log.d("intent", "intent response is null");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



//写数据

// try {

// if(nfcv.isConnected())

// nfcv.close();

// nfcv.connect();

// byte[] command=new byte[15];

// byte[] response=null;

// command[0]=(byte)0x22;

// command[1]=(byte)0x21;

// System.arraycopy(UID, 0, command, 2, UID.length);

// command[10]=(byte)0x1;

// System.arraycopy("jnmu".getBytes(), 0,command, 11, 4);

// response=nfcv.transceive(command);

// if(response==null)

// Log.d("intent", "intent response is null");

// else

// Log.d("intent", "intent response="+Convert.bytesToHexString(response));

// } catch (IOException e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }



}

}



@Override

public void onPause() {

super.onPause();

mAdapter.disableForegroundDispatch(this);

}



@Override

protected void onDestroy() {

// TODO Auto-generated method stub

if(nfcv!=null&&nfcv.isConnected())

try {

nfcv.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

super.onDestroy();

}

}



代码里的onNewIntent()方法包含了读取与写入第一块的代码。因为要用原协议栈所以这里使用transceive()方法,看看代码还是挺简单的,主要是要弄懂15693的协议栈是怎么读写标签的,可以参考:15693协议中文版,这个在CSDN就有资源,可以自行搜索下载。

提供个下载地址:http://download.csdn.net/detail/john610/4127139#comment
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: