一:將數(shù)據(jù)寫入NFC 標(biāo)簽
往可讀寫的nfc標(biāo)簽中寫tag相比讀什么的要簡單一點(diǎn)步做。當(dāng)然這主要是因?yàn)椋以谶@里只講如何寫ndef數(shù)據(jù)坐慰。簡單概括一下就是自己構(gòu)造一個(gè)或多個(gè)NdefRecord然后將他們封裝到一個(gè)NdefMessage中。然后將這個(gè)message寫入就可以了。
private void writeNdefTag(Intent in){
Tag tag = in.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef = Ndef.get(tag);
try {
//這一句別丟了个盆,讀nfc標(biāo)簽的時(shí)候不需要這句脖岛,因?yàn)槟菚r(shí)數(shù)據(jù)直接就在intent中。
ndef.connect();
//構(gòu)造一個(gè)合適的NdefMessage颊亮。你可以看到代碼里用了NdefRecord數(shù)組柴梆,只不過這個(gè)數(shù)組里只有一個(gè)record
NdefMessage ndefMsg = new NdefMessage(new NdefRecord[]{createRecord()});
ndef.writeNdefMessage(ndefMsg);
} catch (IOException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
}
創(chuàng)建一個(gè)Record的舉例,注釋掉的是舉例寫一個(gè)url進(jìn)去终惑,到時(shí)候一掃描就會(huì)直接調(diào)用瀏覽器程序绍在。沒有注釋的是嘗試調(diào)用一個(gè)本地應(yīng)用,只要一掃描就會(huì)直接啟動(dòng)應(yīng)用
private NdefRecord createRecord(){
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI,
"http://www.sohu.com".getBytes(Charset.forName("US-ASCII")),
new byte[0], new byte[0]);
return new NdefRecord(
NdefRecord.TNF_MIME_MEDIA ,
"application/com.android.TestNfc".getBytes(Charset.forName("US-ASCII")),
new byte[0], "com.android.yufeimusic".getBytes(Charset.forName("US-ASCII")));
}
二:Android Beam
再來講講android 4.0之后的新特性雹有,android beam偿渡。如果你和你的朋友都恰好有一部android NFC手機(jī),而且都是4.0的系統(tǒng)霸奕,那你們就可以玩一下了溜宽。把nfc功能打開,然后打開聯(lián)系人界面质帅,然后將兩個(gè)手機(jī)背靠背放在一起适揉,手指輕輕一點(diǎn)。你的聯(lián)系人數(shù)據(jù)就會(huì)唰的一下飛到對(duì)方手機(jī)里去了煤惩。這個(gè)非常有意思嫉嘀,而且實(shí)現(xiàn)也很簡單。
主要是在代碼中的onCreate中要設(shè)置回調(diào)魄揉。
mNfcAdapter.setNdefPushMessageCallback(this, this);
其中第一個(gè)this就是CreateNdefMessageCallback 回調(diào)函數(shù)剪侮。他中間你要實(shí)現(xiàn)的也就是下面的createNdefMessage
第二個(gè)this,貌似指的是由哪一個(gè)activity來接受系統(tǒng)回調(diào)...好吧...沒做實(shí)驗(yàn)我就不多說了怕誤導(dǎo)自己
以下的代碼全部為android文檔中的示例代碼什猖,比較簡單票彪,也就是創(chuàng)建了一個(gè)字符串NdefMessage然后傳過去。到時(shí)候不狮,另外一個(gè)設(shè)備收到Intent后如何解析降铸,你可以參看之前的過濾和解析博文
public NdefMessage createNdefMessage(NfcEvent event) {
Time time = new Time();
time.setToNow();
String text = ("Beam me up!\n\n" + "Beam Time: " + time.format("%H:%M:%S"));
NdefMessage msg = new NdefMessage(
new NdefRecord[] { createMimeRecord(
"application/com.example.android.beam", text.getBytes()),
NdefRecord.createApplicationRecord("com.example.android.beam")
});
return msg;
}
public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefRecord mimeRecord =
new NdefRecord( NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
return mimeRecord;
}
當(dāng)然系統(tǒng)中有關(guān)android beam的不會(huì)只有這一個(gè)回調(diào)。比如還有
mNfcAdapter.setOnNdefPushCompleteCallback(this, this);
這個(gè)回調(diào)主要是用來當(dāng)你的NdefMessage發(fā)送到對(duì)方成功之后摇零,你要干什么的一個(gè)回調(diào)函數(shù)推掸。
比如你可以向用戶主線程發(fā)一個(gè)handler或者自己彈出個(gè)toast都是可以的。
@Override
public void onNdefPushComplete(NfcEvent arg0) {
mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
}