android NFC学习笔记(三)

来源:互联网 发布:淘宝技术这10年百度云 编辑:程序博客网 时间:2024/04/30 09:29

一:将数据写入NFC 标签

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

 

    privatevoid 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(newNdefRecord[]{createRecord()});
           ndef.writeNdefMessage(ndefMsg);
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (FormatException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
    }

 

创建一个Record的举例,注释掉的是举例写一个url进去,到时候一扫描就会直接调用浏览器程序。没有注释的是尝试调用一个本地应用,只要一扫描就会直接启动应用

    privateNdefRecord 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。如果你和你的朋友都恰好有一部androidNFC手机,而且都是4.0的系统,那你们就可以玩一下了。把nfc功能打开,然后打开联系人界面,然后将两个手机背靠背放在一起,手指轻轻一点。你的联系人数据就会唰的一下飞到对方手机里去了。这个非常有意思,而且实现也很简单。

主要是在代码中的onCreate中要设置回调。       

 

 mNfcAdapter.setNdefPushMessageCallback(this,this);

其中第一个this就是CreateNdefMessageCallback回调函数。他中间你要实现的也就是下面的createNdefMessage

第二个this,貌似指的是由哪一个activity来接受系统回调...好吧...没做实验我就不多说了怕误导自己

以下的代码全部为android文档中的示例代码,比较简单,也就是创建了一个字符串NdefMessage然后传过去。到时候,另外一个设备收到Intent后如何解析,你可以参看之前的过滤和解析博文

    publicNdefMessage 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) {        // A handler is needed to send messages to the activity when this        // callback occurs, because it happens from a binder thread        mHandler.obtainMessage(MESSAGE_SENT).sendToTarget();    }
0 0