一、NFC知识
1、NFC是什么?
NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术,它提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务 。
2、NFC的技术优势?
与蓝牙相比:NFC操作简单,配对迅速
与RFID相比:NFC适用范围广泛、可读可写,能直接集成在手机中
与红外线相比:数据传输较快、安全性高、能耗低
与二维码相比:识别迅速、信息类型多样
将来与移动支付相结合,势必简化支付的购买流程,重塑消费者的购物模式。
二、android下读写NFC
1、在AndroidManifest.xml中申明NFC权限
<uses-permission android:name="android.permission.NFC" />
<!-- 这项不一定需要,可以在android market中显示有NFC硬件 -->
<uses-feature android:name="android.hardware.nfc" android:required="true" />
2、NFC TAG的发布系统
当android设备扫描到一个NFC标签时,会自动寻找最适合的activity来处理这个TAG,如果有多个activity满足条件的话,会让用户选择使用哪个activity来处理,可理解为简单的事件响应与时间处理。
activity使用intentfilter来监听扫描到NFC标签事件。
IntentFilter ifilters = new IntentFilter();
ifilters.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);//NDEF
ifilters.addAction(NfcAdapter.ACTION_TAG_DISCOVERED);//TAG
ifilters.addAction(NfcAdapter.ACTION_TECH_DISCOVERED);//TECH
3、检测到标签后在Activity中的处理流程
3.1 在onCreate()中获取NfcAdapter对象
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
3.2 在onNewIntent()中获取Tag对象或者NdefMessage信息
//获取Tag对象
Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);
//获取NdefMessage信息
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
3.3 也可以通过Tag创建Ndef对象等,以实现标签的属性和I/O操作。
Ndef ndef = Ndef.get(tag);
4、NDEF格式标签的读取流程
4.1 在onCreate()中获取NfcAdapter对象
4.2 在onNewIntent()中判断是否为NDEF格式标签(ACTION_NDEF_DISCOVERED),若是则获取NdefMessage信息;(需要强制转换成NdefMessage对象)
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
4.3 对NdefMessage对象进行解析,获取相关的文本信息或Uri等
5、NDEF格式标签的写入流程
5.1 在onCreate()中获取NfcAdapter对象
5.2 在onNewIntent()中获取Tag对象
Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);
5.3 通过Tag创建Ndef对象
Ndef ndef = Ndef.get(tag);
5.4 将文本等数据封装成NdefMessage
5.5 判断是否为NDEF格式标签
若是NDEF格式:
(1)允许进行标签操作:ndef.connect();
(2)调用ndef.writeNdefMessage(NdefMessage)方法写入。
若非NDEF格式:
(1)NdefFromatable format = NdefFromatable.get();
(2)允许进行标签操作:format.connect();
(3)调用format.format(NdefMessage)方法写入。
三、测试代码
import java.io.UnsupportedEncodingException;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.tech.NfcA;
import android.nfc.tech.NfcB;
import android.nfc.tech.NfcF;
import android.nfc.tech.NfcV;
import android.os.Bundle;
import android.os.Parcelable;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
* 注:谷歌推荐的数据格式为NDEF,所以本次DEMO的读写都是采用该格式.
*/
public class MainActivity extends Activity {
private TextView ifo_NFC;
private NfcAdapter nfcAdapter;
private String readResult = "";
private PendingIntent pendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;
private boolean isFirst = true;
private Button toWBtn;
private IntentFilter ndef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a