我知道你可以简单地通过创建一个意图并开始和活动来模拟NFC标签。根据我的理解和测试,只有在清单中添加了intent-filters时才有效。
我想模拟标记并仅通过前台调度将它们分发到活动/片段,因此在清单中使用intent-filters启动活动不是一个选项对我来说。
我的程序结构如下所示:Activity - >几个片段,其中一个片段通过前台调度对NFC标签感兴趣。 nfc-fragment具有pendingIntent和dispatch-enabled和-disabling的必要代码。 该活动实现onNewIntent()方法,如果nfc片段处于活动状态,则通过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片段并调用方法从测试内部手动处理意图,但这给了我
android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
因为该方法涉及更新视图和诸如此类的东西。它以某种方式工作,因为我只需要切换到不同的活动或片段然后返回以获取视图更新,但我想知道是否有更好更清洁的方式这样做。
感谢您的帮助,如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
我假设solo.getCurrentActivity()
指的是应该接收NFC意图的活动,否则您必须调整活动类和上下文以引用正确的值:
Class activityCls = solo.getCurrentActivity().getClass();
Context packageContext = solo.getCurrentActivity();
然后创建挂起的intent(更好的是,您可以使用传递给enableForegroundDispatch()方法的PendingIntent):
PendingIntent pendingIntent = PendingIntent.getActivity(
packageContext,
0,
new Intent(packageContext, activityCls).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
0);
设置NFC意图的参数:
String intentAction = NfcAdapter.ACTION_TAG_DISCOVERED;
Tag tag = ...;
byte[] tagId = ...;
NdefMessage ndefMessage = ...;
准备NFC意图:
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);