簡體   English   中英

如何測試/模擬NFC前台調度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM