android NFC学习笔记(三)

一:将数据写入NFC 标签
往可读写的nfc标签中写tag相比读什么的要简单一点。当然这主要是因为,我在这里只讲如何写ndef数据。简单概括一下就是自己构造一个或多个NdefRecord然后将他们封装到一个NdefMessage中。然后将这个message写入就可以了。

private void writeNdefTag(Intent in){
    Tag tag = in.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    Ndef ndef = Ndef.get(tag);
    try {
        //这一句别丢了,读nfc标签的时候不需要这句,因为那时数据直接就在intent中。
        ndef.connect(); 
        //构造一个合适的NdefMessage。你可以看到代码里用了NdefRecord数组,只不过这个数组里只有一个record
        NdefMessage ndefMsg = new NdefMessage(new NdefRecord[]{createRecord()});
        ndef.writeNdefMessage(ndefMsg);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (FormatException e) {
        e.printStackTrace();
    }
}

创建一个Record的举例,注释掉的是举例写一个url进去,到时候一扫描就会直接调用浏览器程序。没有注释的是尝试调用一个本地应用,只要一扫描就会直接启动应用
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手机,而且都是4.0的系统,那你们就可以玩一下了。把nfc功能打开,然后打开联系人界面,然后将两个手机背靠背放在一起,手指轻轻一点。你的联系人数据就会唰的一下飞到对方手机里去了。这个非常有意思,而且实现也很简单。
主要是在代码中的onCreate中要设置回调。

mNfcAdapter.setNdefPushMessageCallback(this, this);

其中第一个this就是CreateNdefMessageCallback 回调函数。他中间你要实现的也就是下面的createNdefMessage
第二个this,貌似指的是由哪一个activity来接受系统回调...好吧...没做实验我就不多说了怕误导自己
以下的代码全部为android文档中的示例代码,比较简单,也就是创建了一个字符串NdefMessage然后传过去。到时候,另外一个设备收到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; 
}

当然系统中有关android beam的不会只有这一个回调。比如还有

mNfcAdapter.setOnNdefPushCompleteCallback(this, this);

这个回调主要是用来当你的NdefMessage发送到对方成功之后,你要干什么的一个回调函数。
比如你可以向用户主线程发一个handler或者自己弹出个toast都是可以的。

@Override
public void onNdefPushComplete(NfcEvent arg0) {
    mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();
}

你可能感兴趣的:(android NFC学习笔记(三))