当我的Android NFC应用程序接近NFC(智能卡)时,如何阻止其循环

当我的Android NFC应用程序接近NFC(智能卡)时,如何阻止其循环,android,nfc,Android,Nfc,我的Android nfc应用程序在读完智能卡后,会再次显示相同的nfc标签信息,并由操作系统再次启动。事实上,如果你不移动手机,它就会进入一个永久的循环。 读取的数据量确实需要一到两秒钟,因此在结束时会再次启动。 (这在我的Galaxy S2姜饼和ICS上的S3上相当常见) 当NFC源(智能卡)未更改且未从手机中移开时,如何停止重复 “我的活动”的目的过滤器为: <intent-filter > <action andr

我的Android nfc应用程序在读完智能卡后,会再次显示相同的nfc标签信息,并由操作系统再次启动。事实上,如果你不移动手机,它就会进入一个永久的循环。 读取的数据量确实需要一到两秒钟,因此在结束时会再次启动。 (这在我的Galaxy S2姜饼和ICS上的S3上相当常见)

当NFC源(智能卡)未更改且未从手机中移开时,如何停止重复

“我的活动”的目的过滤器为:

            <intent-filter >
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
            </intent-filter>
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/filter_nfc" />

解决这个问题的唯一方法是在onCreate(setContentView行和resolveIntent行)内部以及onNewIntent函数内部进行时间检查

这并没有阻止Android再次尝试调用应用程序来处理NFC,但如果在上次成功读取NFC后的2秒内调用,我的应用程序将不会执行任何操作


可能不是最干净的方法,但它可以有效地解决循环问题,并通过不同设备上的所有测试。

这不正常,但我也看到过类似的行为。我尝试的是启用NFC前台调度。这使您的应用程序能够完全控制传入的NFC意图。然后根据标签的ID(或者根据上次NFC事件后经过的时间),您可以决定忽略标签

@Override
protected void onResume() {
  ...
  ForegroundDispatch.setupForegroundDispatch(this);
}

@Override
protected void onPause() {
  ...
  ForegroundDispatch.stopForegroundDispatch(this);
};

@Override
public void onNewIntent(Intent intent) {
  ... // check for the tag's ID or elapsed time to determine how to react
}

再次感谢NFC的家伙!这个问题是非常困难的,因为某些手机和卡显示了它,而其他手机和卡则没有显示-我的解决方案如下。我确实使用前台调度,而ID读取并不总是可靠的——因此我不得不利用时间延迟来忽略其他请求。一旦第二个被忽略,它似乎停止了永恒的循环!
@Override
protected void onCreate(Bundle savedInstanceState) {
    resolveIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent) {
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

private void resolveIntent(Intent intent) {
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    final String action = intent.getAction();
    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                 || NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        ....work
        handled = true;
    }
    if (!handled) {
        Log.e(tag, "Unknown intent " + intent);
        finish();
        return;
    }
}
@Override
protected void onResume() {
  ...
  ForegroundDispatch.setupForegroundDispatch(this);
}

@Override
protected void onPause() {
  ...
  ForegroundDispatch.stopForegroundDispatch(this);
};

@Override
public void onNewIntent(Intent intent) {
  ... // check for the tag's ID or elapsed time to determine how to react
}