Android NFC的使用

Posted gouphigh2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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标准。

2、NFC的功能

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

3、NFC标签的写入和读取


准备工作

使用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);
                
            
        
    

未完待续

以上是关于Android NFC的使用的主要内容,如果未能解决你的问题,请参考以下文章

NFC在Android中的应用

HostApduService (NFC) 中的 Android 多线程

如何在Android中测量NFC RSSI?

如何在android中测量NFC RSSI?

nfc-a协议的时序要求

NFC 提供啥样的带宽?