Android NFC的使用

1、NFC介绍

近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20cm以内,类似于蓝牙的通讯协议但传输距离更短的通讯方式。其传输速度有106Kb/s,212Kb/s或424Kb/s三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。
Android NFC的使用_第1张图片

2、NFC的功能

打开音乐播放器
打开蓝牙连接车载
打开移动网络
打开GPS
设置静音
设置飞行模式
打开商品网页介绍
……

3、NFC标签的写入和读取


Android NFC的使用_第2张图片

准备工作

使用NFC功能,需要配置NFC权限:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

设置接收NFC标签“滴一声”的Activity的启动模式为SingleTop:

android:launchMode="singleTop"

那么在NFC标签贴近手机后背后,系统会发送一个Intent给当前Activity,因为启动模式是singleTop,于是会调用onNewIntent方法,我们在这个方法里给NFC标签写入数据:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        write(intent);
    }

还要不能忘了在onResume和onPause中设置NFC优先处理:

@Override
    protected void onResume() {
        super.onResume();
        if (nfcAdapter != null) {
            //设置当前程序为优先处理nfc的程序
            nfcAdapter.enableForegroundDispatch(this, pi, null, null);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (nfcAdapter != null) {
            nfcAdapter.disableForegroundDispatch(this);
        }
    }

NFC标签写入

 private void write(Intent intent) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag == null) {
            return;
        }

        //写入数据
        NdefRecord[] ndefRecord = new NdefRecord[4];
        ndefRecord[0] = NdefRecord.createApplicationRecord("com.idengpan.nfc");//packageName//打开某个APP
        ndefRecord[1] = NdefRecord.createUri("http://blog.csdn.net/ada_dengpan");//打开网页
        ndefRecord[2] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT,new byte[]{0},"com.idengpan.nfc".getBytes(Charset.forName("utf-8")));//写入纯文本
        ndefRecord[3] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT,new byte[]{0},"1".getBytes(Charset.forName("utf-8")));//写入纯文本

        NdefMessage ndefMessage = new NdefMessage(ndefRecord);

        Ndef ndef = Ndef.get(tag);//当做是一种NDEF格式
        try {
            if (ndef != null) {
                ndef.connect();
                if (ndef.isWritable()) {
                    int size = ndefMessage.toByteArray().length;
                    if (ndef.getMaxSize() > size) {
                        ndef.writeNdefMessage(ndefMessage);
                    }else{
                        Toast.makeText(getApplicationContext(),"写入数据超过NFC标签容量" + size +" > " + ndef.getMaxSize(),Toast.LENGTH_SHORT).show();
                    }
                }
            } else {
                NdefFormatable ndefFormatable = NdefFormatable.get(tag);
                if (ndefFormatable != null) {
                    ndefFormatable.connect();
                    ndefFormatable.format(ndefMessage);
                }
            }
            Toast.makeText(getApplicationContext(), "写入成功!", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (FormatException e) {
            e.printStackTrace();
        }

    }

上面的例子写入了4条记录到NFC标签中,那么退出当前NFC app后,将NFC标签贴近手机后背,就会执行每一条记录内容。其中,前两条是系统自带的行为,第一个是打开某个包名的app,第二个是使用系统默认浏览器打开一个网页。当然,还有其他行为可以看相关源码。

NFC读取

private void read(Intent intent){
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag == null) {
            return;
        }
        if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())){
            Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            if(data != null){
                NdefMessage [] ndefMessages = new NdefMessage[data.length];
                for(int i=0;i<ndefMessages.length;i++){
                    ndefMessages[i] = (NdefMessage) data[i];
                    NdefRecord [] ndefRecords = ndefMessages[i].getRecords();

                    //获取标签里的文本
                    String packageName = new String(ndefRecords[2].getPayload());
                    String flag = new String(ndefRecords[3].getPayload());

                    //根据flag启动蓝牙
                    if("1".equals(flag)){
                        //根据写入的值做些什么事
                    }

                    //根据包名启动app
                    Intent  startAPP = getPackageManager().getLaunchIntentForPackage(packageName);
                    startActivity(startAPP);
                }
            }
        }
    }

未完待续

你可能感兴趣的:(NFC,近场通信,AndroidNFC,NFC标签)