2012-09-27 129 views
5

我有一個類,它創建了NFC和兩個活動的連接。他們都創建該類的對象,以便他們可以連接到NFC。 早些時候它以某種方式工作,但現在我有問題 - 即使在第一個活動上,我的應用程序也不會對NewIntent執行任何操作。取而代之的是,我可以從名爲「標籤」(Nexus S)的內置應用程序中看到「收集到新標籤」。「收集新標籤」而不是閱讀應用程序標籤 - NFC android

我該怎麼辦?

類:

public NFCForegroundUtil(Activity activity) 
{ 
    super(); 
    this.activity = activity; 
    mAdapter = NfcAdapter.getDefaultAdapter(activity 
      .getApplicationContext()); 

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
      activity, activity.getClass()) 
      .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 
    IntentFilter ndef2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); 
    IntentFilter ndef3 = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); 

    try 
    { 
     ndef2.addDataType("*/*"); 
    } 
    catch (MalformedMimeTypeException e) 
    { 
     throw new RuntimeException("fail", e); 
    } 

    mFilters = new IntentFilter[] {ndef, ndef2, ndef3 }; 

    mTechLists = new String[][] { new String[] { 
      // android.nfc.tech.NfcV.class.getName(), 
      android.nfc.tech.NfcA.class.getName(), 
      android.nfc.tech.IsoDep.class.getName() } }; 

    mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); 

} 

活動1:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    nfcForegroundUtil = new NFCForegroundUtil(this); 

} 

@Override 
protected void onNewIntent(Intent intent) 
{ 

    super.onNewIntent(intent); 
    Intent i = new Intent(this, NfcDisplayLabelActivity2.class); 
    startActivity(i); 

} 

回答

-2

我看到從內置的應用程序稱爲「標籤」,因爲我的應用程序沒有正常工作「收集新的標籤」。

當它工作正常時,它比我的應用程序中的「標籤」和電話讀取標籤具有更高的優先級。但是,當它工作不正常,手機收集標籤時,「標籤」應用程序將被激活,「標籤」應用程序會與我的設備進行通話。

修復代碼後,我的應用程序使用我的應用程序具有更高的優先級和電話讀取標記。

+5

那麼,你是如何使它正常工作的? –

+0

如果您仍然有問題,請查看我的答案。 – MagicSeth

+3

這個答案中確實沒有任何有用的數據。簡單地說,「哦,我更正了我的應用程序,現在它的工作原理」並沒有告訴社區關於該應用程序被更正以及您最初做錯了什麼的任何事情。 – jwir3

5

進入設置 - >應用程序 - >全部 - >標籤(在我的情況) - >禁用

+0

這不是解決方案。他應該在技術列表中過濾適當的標籤,或者使用adapter.enableForegroundDispatch(this,pendingIntent,null,null);如下圖所示,當應用程序被預先插入時,會有一個很好的答案 – John

3

我試圖從一個NFC標籤打開我的應用程序時,也有類似的問題。我在我的AndroidManifest.xml中爲「magicnfc」方案註冊了一個intentfilter,但它卻打開了Android OS Tags應用程序,而不是我的。

我發現NFC意圖(在我的情況下是TECH_DISCOVERED)比基於通用方案的意圖過濾器具有更高的優先級。由於標籤應用程序註冊了TECH_DISCOVERED,因此它被打開而不是我的。

幸運的是,應用程序可以註冊NDEF_DISCOVERED(一個更高優先級的過濾器)並且打開而不是標籤應用程序。

這讓我的應用程序在我點擊標籤時打開。

更多信息是在這裏: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

但是我發現,我不得不重寫功能onNewIntent,使用如下代碼:

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { 
    String uri = intent.getDataString(); 

    Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
    if (rawMsgs != null) { 
     msgs = new NdefMessage[rawMsgs.length]; 
     for (int i = 0; i < rawMsgs.length; i++) { 
      msgs[i] = (NdefMessage) rawMsgs[i]; 
     } 
    } 
} 

對於我來說,我需要的是:

String uri = intent.getDataString(); 

祝你好運!

3

您可以偵聽所有標籤使用ACTION_TAG_DISCOVERED意圖,而不是過濾特定一個用下面的代碼激活:

public NFCForegroundUtil(Activity activity) 
{ 
    super(); 
    this.activity = activity; 
    mAdapter = NfcAdapter.getDefaultAdapter(activity 
      .getApplicationContext()); 

    mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(
      activity, activity.getClass()) 
      .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 
0); 

    // See below 
    mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); 
} 

NFCAdapter Documentation

如果通過null作爲通配符的過濾器和techLists參數,並且會導致前臺活動通過ACTION_TAG_DISCOVERED意圖接收所有標記。