android nfc
这篇文章介绍了如何在Android中使用NFC 。 NFC技术代表近场通信,您可以在NFC论坛上找到该规范。 在第一篇文章中,我们将分析NFC的一些基本方面,并描述如何在Android中实现可处理NFC标签的应用。
如果您想尝试NFC,可以在几个网站上以几欧元的价格购买NFC。
NFC可以在不同的情况下使用:我们可以在家里在家时使用它来打开妻子或执行任务操作等。
NDEF数据上。 使用NFC之前,我们必须遵循一些基本步骤。
NFC过滤器
当我们使用NFC标签时,我们想要的第一件事是当我们靠近NFC标签时会通知我们的应用程序。 为此,我们使用了意图过滤器 。 Android SDK提供了三种不同的过滤器,我们可以在不同的优先级下使用它们:
- ACTION_NDEF_DISCOVERED
- ACTION_TECH_DISCOVERED
- ACTION_TAG_DISCOVERED
ACTION_NDEF_DISCOVERED上
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.survivingwithandroid.nfc" >
....
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain"/>
</intent-filter>
<manifest>
在第6行,我们注册了我们的应用程序,以便可以通过ACTION_NDEF_DISCOVERED
通知ACTION_NDEF_DISCOVERED
。 我们可以使用不同类型的过滤器,在本示例中(第8行),我们使用了mime type 。 换句话说,当发现NFC标签NDEF且其MIME类型为text / plain时,我们的应用将启动。 我们可以使用几种MIME类型进行过滤,而不仅仅是文本/疼痛。 此外,我们可以使用其他类型的过滤器,例如android:scheme来使用协议或字符串模式进行过滤。
NFC前景调度
NFC前景调度的技术。 第一步是在我们的代码中定义意图过滤器(就像在manifest.xml中一样):
@Override
protected void onCreate(Bundle savedInstanceState) {
...
Intent nfcIntent = new Intent(this, getClass());
nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
nfcPendingIntent =
PendingIntent.getActivity(this, 0, nfcIntent, 0);
IntentFilter tagIntentFilter =
new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
tagIntentFilter.addDataType("text/plain");
intentFiltersArray = new IntentFilter[]{tagIntentFilter};
}
catch (Throwable t) {
t.printStackTrace();
}
}
现在我们必须注册我们的过滤器,并以这种方式在onResume
方法中进行操作:
protected void onResume() {
super.onResume();
nfcAdpt.enableForegroundDispatch(
this,
nfcPendingIntent,
intentFiltersArray,
null);
handleIntent(getIntent());
}
此外,我们还应记住,一旦应用程序进入后台,并且在onPause方法中执行此操作的最佳位置,就应立即禁用前台调度。
@Override
protected void onPause() {
super.onPause();
nfcAdpt.disableForegroundDispatch(this);
}
其中nfcAdpt是NFC适配器。
使用NFCAdapter处理NFC
创建过滤器后,我们必须与智能手机中的NFC组件进行交互。 为此,我们使用Android SDK提供的NfcAdapter 。 使用此类,我们可以检查例如我们的智能手机是否支持NFC或NFC是打开还是关闭:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
nfcAdpt = NfcAdapter.getDefaultAdapter(this);
// Check if the smartphone has NFC
if (nfcAdpt == null) {
Toast.makeText(this, "NFC not supported", Toast.LENGTH_LONG).show();
finish();
}
// Check if NFC is enabled
if (!nfcAdpt.isEnabled()) {
Toast.makeText(this, "Enable NFC before using the app", Toast.LENGTH_LONG).show();
}
}
NFC数据:有效负载
一旦知道了如何处理NFC标签,便要读取标签内容。 NFC规范中定义了几种类型的内容:
- NFC论坛知名类型
- 媒体类型
- 绝对URI
- NFC论坛外部类型
Message组成。 一条消息可以包含一个或多个记录 。 每条记录由标题和有效载荷
@Override
public void onNewIntent(Intent intent) {
Log.d("Nfc", "New intent");
getTag(intent);
}
private void getTag(Intent i) {
if (i == null)
return ;
String type = i.getType();
String action = i.getAction();
List dataList = new ArrayList();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Log.d("Nfc", "Action NDEF Found");
Parcelable[] parcs = i.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
for (Parcelable p : parcs) {
recNumberTxt.setText(String.valueOf(numRec));
NdefRecord[] records = msg.getRecords();
for (NdefRecord record: records) {
short tnf = record.getTnf();
// Here we handle the payload
}
}
}
}