gpt4 book ai didi

android - 如何测试/模拟 NFC 前台调度?

转载 作者:行者123 更新时间:2023-11-28 20:31:19 26 4
gpt4 key购买 nike

我知道您可以简单地通过创建 Intent 并使用它启动和 Activity 来模拟 NFC 标签。根据我的理解和测试,这仅在您向 list 中添加 Intent 过滤器时才有效。

我想模拟标签并仅通过前台分派(dispatch)将它们分派(dispatch)到 Activity/fragment ,因此无法使用 list 中的 Intent 过滤器启动 Activity 对我来说。

我的程序结构如下所示:Activity -> 几个 Fragments,其中一个通过前台调度对 NFC 标签感兴趣。nfc fragment 具有用于 pendingIntent 和调度启用和禁用的必要代码。该 Activity 实现 onNewIntent() 方法,如果 nfc fragment 处于 Activity 状态,该方法会通过 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 并调用方法从测试内部手动处理 Intent ,但这给了我

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

因为该方法涉及更新 View 和诸如此类的东西。它以某种方式有效,因为我只需要切换到不同的 Activity 或 fragment ,然后返回以获取 View 更新,但我想知道是否有更好、更简洁的方法这个。

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

最佳答案

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

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 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);
}
}
}

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

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

关于android - 如何测试/模拟 NFC 前台调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com