[英]How do I test/simulate NFC foreground dispatching?
我知道您可以簡單地通過創建意圖並以此來啟動和活動來模擬NFC標簽。 根據我的理解和測試,只有在清單中添加意圖過濾器時,此方法才有效。
我只想模擬標簽,並僅通過前台派發將其發送到活動/片段,所以對於清單而言,在清單中使用intent-filters啟動活動不是一種選擇。
我的程序結構如下:活動->多個片段,其中一個片段對通過前台分派的NFC標簽感興趣。 nfc片段具有未決的必要代碼,以及pending-enabled和-disabling的代碼。 該活動實現onNewIntent()方法,如果nfc片段處於活動狀態,則該調用通過nfc片段中的方法調用意圖的進一步處理。
該程序工作正常,但我需要使用自動化測試來測試行為。
我已經嘗試使用
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:只有創建視圖層次結構的原始線程才能觸摸其視圖。
因為該方法涉及更新Views等等。 它以某種方式起作用,因為我只需要切換到其他活動或片段,然后返回以獲取視圖更新,但是我想知道是否有更好,更清潔的方法。
感謝您的幫助,如果需要更多信息,請告訴我。
我假設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意圖的參數:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.