manifest配置:权限配置,nfc要求,最小sdk
您的应用支持的最低 SDK 版本。API 级别 9 仅通过 ACTION_TAG_DISCOVERED 支持有限的标签调度,并且只能通过 EXTRA_NDEF_MESSAGES extra 提供对 NDEF 消息的访问权限。无法访问其他任何标签属性或 I/O 操作。API 级别 10 提供全面的读取器/写入器支持以及前台 NDEF 推送功能;API 级别 14 则提供了一种更简便的方式(即,使用 Android Beam 将 NDEF 消息推送到其他设备),同时提供了用于创建 NDEF 记录的其他便捷方法。
<uses-sdk android:minSdkVersion="10"/>
<uses-feature android:name="android.hardware.nfc" android:required="true" />
<uses-permission android:name="android.permission.NFC" />
NfcAdapter对象获取
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
判断设备是否支持NFC 和判断NFC功能是否打开
if (nfcAdapter == null) {
//设备不支持NFC
}
//NFC 功能是否打开,没打开可以弹框提示,跳转到设置中的NFC开关界面
nfcAdapter.isEnabled()
读取卡片的方法
在manifest中设置Activity的 intent-filter的action等过滤规则,在android系统识别到NFC标签后跳转到Activity。这种方法可能会出现多个应用的APP提供了nfc功能需要用户选择,用户选择Activity操作又容易离开NFC标签,很不方便。使用前台调度系统,这个优先级比intent-filter高
- Activity设置过滤
action优先级:
- enableForegroundDispatch使用前台调度系统
PendingIntent pi= PendingIntent.getActivity(this, 0, new Intent(this,
getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter[] mFilters = new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED),
new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)};
String[][] mTechLists = new String[][]{
new String[]{IsoDep.class.getName()},
new String[]{NfcA.class.getName()},
new String[]{NfcB.class.getName()},
new String[]{NfcF.class.getName()},
new String[]{NfcV.class.getName()}};
// onResume
nfcAdapter.enableForegroundDispatch(this, pi, mFilters, mTechLists);
// onPause
nfcAdapter.disableForegroundDispatch(this);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
- Android 4.4更新了NFC的读卡器模式 enableReaderMode
NFC 读取器模式
新的 NFC 读取器模式允许 Activity 将所有 NFC Activity 限制为在前台时仅读取 Activity 感兴趣的标记类型。您可以使用 enableReaderMode() 为您的 Activity 启用读取器模式,提供一个 NfcAdapter.ReaderCallback 的实现,用于在检测到新的标记时接收回调。
private static final int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A
| NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK | NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS;
NfcAdapter.ReaderCallback mReaderCallback = new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(Tag tag) {
Log.d(TAG, "onTagDiscovered: " + Arrays.toString(tag.getTechList()));
}
};
// onResume
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
nfcAdapter.enableReaderMode(this, mReaderCallback, READER_FLAGS, null);
}
// onPause
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
nfcAdapter.disableReaderMode(this);
}