【问题标题】:How do I test/simulate NFC foreground dispatching?如何测试/模拟 NFC 前台调度?
【发布时间】:2014-07-07 20:17:14
【问题描述】:

我知道您可以简单地通过创建意图并使用它启动和活动来模拟 NFC 标签。根据我的理解和测试,这只有在您将意图过滤器添加到清单时才有效。

我想模拟标签并仅通过前台调度将它们调度到活动/片段,因此不能在清单中使用意图过滤器启动活动对我来说。

我的程序结构如下所示:Activity -> 几个 Fragment,其中一个通过前台调度对 NFC 标签感兴趣。 nfc-fragment 具有用于pendingIntent 和dispatch-enable 和-disabling 的必要代码。 Activity 实现了 onNewIntent() 方法,如果 nfc-fragment 处于活动状态,该方法会通过 nfc-fragment 中的方法调用对 Intent 的进一步处理。

程序运行良好,但我需要使用自动化测试来测试其行为。

我已经尝试过使用

final Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
intent.putExtra(NfcAdapter.EXTRA_ID, "1234567890".getBytes());
solo.getCurrentActivity().startActivity(intent);

但这只是给了我一个ActivityNotFoundException。目前我检索 nfc-fragment 并调用该方法从测试内部手动处理意图,但这给了我

android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

因为该方法涉及更新视图等。它以某种方式工作,因为我只需要切换到不同的活动或片段,然后返回以获取视图更新,但我想知道是否有更好和更清洁的方法这个。

感谢您的帮助,如果您需要更多信息,请告诉我。

【问题讨论】:

  • 好奇你为什么使用ACTION_TAG_DISCOVERED而不是ACTION_TECH_DISCOVERED
  • @IgorGanapolsky 我不确定,因为它已经六年多了。快速浏览一下文档告诉我ACTION_TECH_DISCOVERED 需要一个清单条目,我对标签技术不感兴趣,但只要标签被识别(加上缺乏专业知识)。

标签: android testing android-fragments nfc foreground


【解决方案1】:

我假设solo.getCurrentActivity() 指的是应该接收 NFC 意图的活动,否则您必须调整活动类和上下文以引用正确的值:

Class activityCls = solo.getCurrentActivity().getClass();
Context packageContext = solo.getCurrentActivity();

然后您创建待处理的意图(更好的是,您可以使用传递给 enableForegroundDispatch() 方法的 PendingIntent):

PendingIntent pendingIntent = PendingIntent.getActivity(
    packageContext,
    0,
    new Intent(packageContext, activityCls).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
    0);

设置 NFC Intent 的参数:

String intentAction = NfcAdapter.ACTION_TAG_DISCOVERED;
Tag tag = ...;
byte[] tagId = ...;
NdefMessage ndefMessage = ...;

准备 NFC Intent:

Intent intent = new Intent();
intent.setAction(intentAction);
intent.putExtra(NfcAdapter.EXTRA_TAG, tag);
intent.putExtra(NfcAdapter.EXTRA_ID, tagId);
if (ndefMessage != null) {
    intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[] { ndefMessage });

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentAction)) {
        Uri uri = message.getRecords()[0].toUri();
        String mime = message.getRecords()[0].toMimeType();
        if (uri != null) {
            intent.setData(uri);
        } else {
            intent.setType(mime);
        }
    }
}

使用上面的参数化设置发送待处理的意图:

pendingIntent.send(packageContext, Activity.RESULT_OK, intent);

【讨论】:

  • @IgorGanapolsky 它为intent.putExtra(NfcAdapter.EXTRA_TAG, tag);初始化(模拟)标签对象
猜你喜欢
  • 2011-08-22
  • 2018-01-24
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2022-01-10
  • 2015-08-30
相关资源
最近更新 更多