如何在靠近 NFC(智能卡)时停止我的 Android NFC 应用程序循环

Posted

技术标签:

【中文标题】如何在靠近 NFC(智能卡)时停止我的 Android NFC 应用程序循环【英文标题】:How to stop my Android NFC app looping when it is close to NFC (smartcard) 【发布时间】:2012-07-30 14:20:03 【问题描述】:

我的 android NFC 应用程序在读取完智能卡后,会再次显示相同的 NFC 标签信息,并由操作系统再次启动。事实上,如果你不移动手机,它就会进入一个永久循环。 正在读取的数据量确实需要一两秒钟,所以最后它会重新开始。 (这在我的 Galaxy S2 Gingerbread 和我的 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" />

技术列表

 <tech-list>
     <tech>android.nfc.tech.IsoDep</tech>
 </tech-list>

源代码:

@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;
    

【问题讨论】:

【参考方案1】:

我可以解决它的唯一方法是在 onCreate(setContentView 行和 resolveIntent 行)内以及 onNewIntent 函数内进行时间检查。

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

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

【讨论】:

【参考方案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 并不总是可靠的——所以我不得不利用时间延迟来忽略其他请求。一旦第二个被忽略,它似乎停止了永恒循环!

以上是关于如何在靠近 NFC(智能卡)时停止我的 Android NFC 应用程序循环的主要内容,如果未能解决你的问题,请参考以下文章

NFC移动支付说明[关闭]

3.安卓NFC开发-解析数据(效果篇)

苹果xr的nfc可以给ETC圈存吗

Android 10 NFC 应用程序 - 在 MS Intune Kiosk 模式下手机睡眠时停止工作

小米手机nfc怎么判断是芯片问题还是感应线圈问题

NFC功能是啥?安卓智能手机如何应用