近场通信(NFC)是一组短距离无线技术,通常需要4厘米或更短的距离才能启动连接。采用NFC的Android设备同时支持三种主要的操作模式:读写器模式、P2P模式、卡模拟模式。
nfc标签支持以下三种标签ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED、ACTION_NDEF_DISCOVERED分发流程如下图
筛选ACTION_TECH_DISCOVERED意图,则必须创建一个XML资源文件,该文件指定您的活动在技术列表集内支持的技术。 如果技术列表集合是标记支持的技术的子集,则可以通过调用getTechList()获得您的活动。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>
在AndroidManifest.xml文件中,在元素内的元素中指定刚才创建的资源文件,如下例所示:
<activity>
...
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
...
</activity>
以上内容来自api文档。
接下来实现以下写入ndef格式的数据。
1、先判断设备是否支持nfc功能
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "对不起,您的设备不支持nfc功能", Toast.LENGTH_SHORT).show();
return;
}
//创建意图
Intent intent = new Intent(this, getClass());
mPendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//2重写onNewIntent方法,获取tag,并写入
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (mNfcAdapter != null) {
Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeNFCTag(tag);
}
}
//3、打开当前页面的时候进行写操作,离开当前页面取消写操作
@Override
protected void onResume() {
super.onResume();
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
}
@Override
protected void onPause() {
super.onPause();
if (mNfcAdapter != null) {
mNfcAdapter.disableForegroundDispatch(this);
}
}
//4、实现写入标签
private void writeNFCTag(Tag _tag) {
if (_tag == null) {
Log.e(TAG, "writeNFCTag:>>>>> 没有获取到tag");
return;
}
Log.e(TAG, "writeNFCTag:>>>>> 获取到tag"+_tag.toString());
/**
* 自动打开应用
*/
// NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{
// NdefRecord.createApplicationRecord(mPackageName)});
/**
* 自动打开网页
*/
NdefMessage ndefMessage=new NdefMessage(new NdefRecord[]{NdefRecord.createUri("http://www.baidu.com/")});
int ndefmessage_size = ndefMessage.toByteArray().length;
Ndef ndef = Ndef.get(_tag);
if (ndef != null) {
try {
ndef.connect();
if (!ndef.isWritable()) {
Log.e(TAG, "writeNFCTag:>>>>>> 标签不可写");
return;
}
if (ndef.getMaxSize() < ndefmessage_size) {
Log.e(TAG, "writeNFCTag:>>>>> 标签存储位置不足");
return;
}
ndef.writeNdefMessage(ndefMessage);
Toast.makeText(this, "标签写入成功", Toast.LENGTH_SHORT).show();
} catch (FormatException _e) {
_e.printStackTrace();
Log.e(TAG, "FormatException:>>>> "+ _e.getMessage());
} catch (IOException _e) {
Log.e(TAG, "IOException:>>>>>> "+ _e.getMessage()); ;
}
}
}