【问题标题】:NFC tag's intent extra lost when discovered from app on background从后台应用程序发现 NFC 标签的意图额外丢失
【发布时间】:2016-10-07 11:58:31
【问题描述】:

我试图让我的应用程序打开一个特定的片段,然后处理该片段中的标签数据。当应用程序在前台运行时它正在工作,但是当我在后台发现 TAG 时,它似乎丢失了额外的数据。

当我阅读 TAG 时,应用程序被置于前台,onNewIntent 被调用,intent actionandroid.nfc.action.TAG_DISCOVERED。但是没有intent.EXTRA_TAG,因为当我直接从前台检测到它时......我做错了什么?

这是我的代码的 NFC 特定部分:

曾经在我的活动中...

@Override
public void onNewIntent(Intent intent) {
    Log.e(TAG, "RETRIVE HERE" + selectedFragment.getTagText() );
    if (selectedFragment instanceof FragmentNfc) {
        Log.e(TAG, "RETRIVE HERE");
        FragmentNfc my = (FragmentNfc) selectedFragment;
        my.processNFC(intent);
    }
}

public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

    final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
    adapter.enableForegroundDispatch(activity, pendingIntent, null, null);
}

public static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter) {
    adapter.disableForegroundDispatch(activity);
}

曾几何时在我的片段中......(当我从背景中检测到 TAG 时,永远不会进入 for 循环)

public void processNFC(Intent intent) {
    Log.e(TAG, "Process NFC");
    String hexdump = "";
    String action = intent.getAction();
    Log.e(TAG, "ACTION: " + action);
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        String[] techList = tag.getTechList();
        String searchedTech = Ndef.class.getName();
        for (String tech : techList) {
            Log.e(TAG, "TECH: " + tech);
            if (searchedTech.equals(tech)) {
                byte[] tagId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
                for (int i = 0; i < tagId.length; i++) {
                    String x = Integer.toHexString(((int) tagId[i] & 0xff));
                    if (x.length() == 1) {
                        x = '0' + x;
                    }
                    hexdump += x;
                    if (i < 6) {
                        hexdump += ":";
                    }
                }
                onNfcReceive(hexdump);
            }
        }
    }
}

从前在清单中...

   <activity
        android:name=".activityv2.ActivityHome"
        android:label="Security Agent"
        android:launchMode="singleInstance"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.nfc.action.TECH_DISCOVERED" />
        </intent-filter>

        <meta-data
            android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/nfc_tag_filter" />
    </activity>

【问题讨论】:

  • 我找到了,在我的清单中我使用了 android.nfc.action.TECH_DISCOVERED 并在代码 NfcAdapter.ACTION_TAG_DISCOVERED 中......太笨了
  • TAG_DISCOVERED 比 TECH_DISCOVERED 好用吗?

标签: android android-fragments android-intent nfc intentfilter


【解决方案1】:

由于您在清单中为操作android.nfc.action.TECH_DISCOVERED 注册了意图过滤器,因此方法onNewIntent() 将收到<b>TECH</b>_DISCOVERED 意图而不是<b>TAG</b>_DISCOVERED 意图。因此,if-branch 的条件

if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {

将评估为 false,您永远不会进入分支。

您可以同时检查TAG_DISCOVEREDTECH_DISCOVERED

if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) ||
    NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

【讨论】:

  • 我最终将它添加到清单中,但您的解决方案也有效......:
  • @Jaythaking 如果您将TAG_DISCOVERED 意图过滤器添加到清单中,请记住TAG_DISCOVERED 与在前台调度系统中使用时的含义不同(包罗万象)。相反,当在清单中使用TAG_DISCOVERED 时,它只是一种后备机制(即捕获那些其他应用程序不需要的标签)。见stackoverflow.com/a/26398314/2425802
  • 确实如此......那么为什么当应用程序在 FOREGROUND 时会捕获 TAG_DISCOVERED?即使我没有在清单中添加那个,它也是意图中设置的操作。我希望它始终是 TECH_DISCOVERED
  • 那是因为您为该意图过滤器注册了前台调度系统(通过将 null 指定为意图过滤器参数)。 TAG_DISCOVERED 对于前台调度确实具有包罗万象的含义。如果您想从前台调度系统接收TECH_DISCOVERED,您必须相应地将调用中的意图过滤器设置为enableForegroundDispatch()
  • 我们为什么需要TAG_DISCOVERED
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多