2014-05-19 30 views
0

我知道你可以簡單地通過創建一個意圖和開始和活動來模擬NFC標籤。根據我的理解和測試,只有在您的清單中添加意圖過濾器時纔有效。如何測試/模擬NFC前景調度?

我想模擬標籤,並通過前景調度只有它們分派到一個活動/片段,所以開始與意向過濾器的活動清單並不是我的選擇。

我的程序的結構如下所示:活動 - >幾個碎片,其中一個通過前臺調度對NFC標籤感興趣。 nfc-fragment具有pendingIntent和dispatch-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的片段,並呼籲從測試中手工處理這個意圖的方法,但是這給了我

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有創建視圖層次原來的線程可以觸摸其觀點。

因爲該方法涉及更新視圖和whatnot。它工作某種程度上,因爲我只需要切換到不同的活動或片段,然後回去獲取視圖更新,但我想知道是否有更好和更乾淨的方式來做到這一點。

我感謝您的幫助,請告訴我您是否需要更多信息。

回答

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意向的參數:

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