我的应用程序在后台和前台使用NFC阅读。对于用户信息,我在活动中使用CountDownTimer(120*1000,5*1000),并使用onTick(long l)方法每5秒检查一次NFC状态。有时(在Android 4.2.2上,我的客户说,这从未发生在我身上)NfcAdapter.getDefaultAdapter(BaseActivity.this)返回null,但后台和前台NFC读取仍然有效!关闭和打开都无济于事。重新安装有帮助。
通过清单读取BG:
<activity
android:name=".activity.NfcReaderActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
通过意向读取FG:
IntentFilter ndef = new IntentFilter();
ndef.addAction(NfcAdapter.ACTION_TECH_DISCOVERED);
ndef.addCategory(Intent.CATEGORY_DEFAULT);
try {
ndef.addDataType("*/*");
} catch (IntentFilter.MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
mNfcAdapter = NfcAdapter.getDefaultAdapter(this.mActivity);
mNfcPendingIntent = PendingIntent.getActivity(
this.mActivity, 0,
new Intent(this.mActivity, this.mActivity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
0
);
mNfcFilters = new IntentFilter[] {
ndef
};
mNfcTechLists = new String[][] { new String[] {
// White solid cards
NfcA.class.getName()
} };
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(
mActivity,
mNfcPendingIntent,
mNfcFilters,
mNfcTechLists
);
}
看起来NfcAdapter已储存或冻结。有人有同样的经历吗?问题出在哪里?
经过一些测试,我有了新的观察结果。这种情况只有在重新启动后才会发生。我以为我的应用程序启动了两次,出现了一些线程死锁,但它没有。如果我以一定的延迟(3秒或更多)启动CountDownTimer(在onCreate方法中调用),它就会工作,并且getDefaultAdapter不是null。如果启动延迟过低(2秒或更短),我在日志中发现了以下消息:"E/NFC:无法检索NFC服务",然后getDefaultAdapter返回null,直到我重新安装应用程序。
所以在执行CountDownTimer之前的短延迟(也许Timer.schedule(…,delay,interval)更好)是临时解决方案,但如果有人知道什么是最好的解决方案,请告诉我。
可能是在模拟器上使用的,在模拟器上你不能用NFC做任何事情。