2014-03-03 111 views
0

我創建了一個獲取NFC UID並將文本視圖更改爲ID的應用程序,但是當我嘗試使用應用程序執行更多操作時,出現錯誤消息。例如,如果我嘗試說...如果UID =「001hghg」,則將另一個文本視圖更改爲「成功!」因此,我想知道是否可以先啓動應用程序,掃描標籤並在onCreate或onResume方法中更改文本視圖。這是下面的代碼:有沒有辦法在不使用onNewIntent的情況下獲得NFC UID?

public class MainActivity extends Activity { 

    TextView tvUID; 

    // list of NFC technologies detected: 
    private final String[][] techList = new String[][] { 
      new String[] { 
       NfcA.class.getName(), 
       NfcB.class.getName(), 
       NfcF.class.getName(), 
       NfcV.class.getName(), 
       NdefFormatable.class.getName(), 
       TagTechnology.class.getName(), 
       IsoDep.class.getName(), 
       MifareClassic.class.getName(), 
       MifareUltralight.class.getName(), 
       Ndef.class.getName() 
      } 
    }; 

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

    } 

    @Override 
    protected void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // creating pending intent: 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
     // creating intent receiver for NFC events: 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(NfcAdapter.ACTION_TAG_DISCOVERED); 
     filter.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED); 
     filter.addAction(NfcAdapter.ACTION_TECH_DISCOVERED); 
     // enabling foreground dispatch for getting intent from NFC event: 
     NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
     nfcAdapter.enableForegroundDispatch(this, pendingIntent, new IntentFilter[]{filter}, this.techList); 

    } 



    @Override 
    protected void onNewIntent(Intent intent) { 
     if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) { 
      tvUID = (TextView) findViewById(R.id.tvUID); 
      tvUID.setText(ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID))); 
     } 
    } 

    private String ByteArrayToHexString(byte [] inarray) { 
     int i, j, in; 
     String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; 
     String out= ""; 

     for(j = 0 ; j < inarray.length ; ++j) 
      { 
      in = (int) inarray[j] & 0xff; 
      i = (in >> 4) & 0x0f; 
      out += hex[i]; 
      i = in & 0x0f; 
      out += hex[i]; 
      } 
     return out; 
    } 

} 

回答

0

正在檢查的動作(ACTION_TAG_DISCOVERED)由ACTION_NDEF_DISCOVERED繞過。我最近在一個NFC項目上工作,出於某種原因,每次我使用這個動作都不會通過(即使使用action_tag_discovered過濾器)。所以我開始僅使用TECH和NDEF_DISCOVERED來檢查發現。

我不知道這是任何幫助,但它有點解決了我所有的問題8-)

也許你可以發佈你所得到的錯誤?

您正在使用哪種環境。您是否使用Android Studio和與adb鏈接的手機?

+0

嗨,這段代碼完美的工作,它給了我的UID,但我不想使用onNewIntent,我想要的是手動啓動應用程序,然後掃描標籤,文本視圖更改爲NFC ID。整個應用程序將UID保存在數據庫中,但這將是另一個難題:( – user1697760

1

意圖是Android的進程間通信手段。因此,被通知有關您的應用程序外部的行爲通常涉及通過意圖通知。掃描NFC標籤的用戶是發生在您的應用程序之外的操作,因此您希望您的應用程序以某種方式通知該事件。通常,NFC服務通過發送意圖來實現這一點,並且您的應用程序註冊以接收該意圖。

在Android上< 4.4,意圖是接收NFC標籤事件通知的唯一方式。在您的應用運行時,您可以通過onNewIntent(清單中的意圖過濾器,前臺調度)或onActivityResult(前臺調度)接收它們。

從Android 4.4開始,有一個新的閱讀器模式API。該API允許您註冊特定回調onTagDiscovered,以便在標籤檢測時觸發。

所以是的,您可以通過onNewIntent之外的其他回調方法收到有關標籤發現的通知。但是,不,onCreate方法將是創建活動時調用的第一個方法。 onStartonResume立即遵循該方法。因此,無法在手動啓動您的活動和調用這些方法之間掃描該標記。

但是,如果您的活動是由NFC意圖啓動的,您可以通過該活動的getIntent方法獲得該意圖。這也適用於onCreate,onStartonResume中的任何一種方法。

+0

嗨,你會給我一些關於如何掃描標籤然後發生另一個活動的建議。例如,一旦標籤被掃描,可以我發送該標籤ID到一個android數據庫?現在,我可以得到的ID,但隨後不能做任何事情與應用程序,因爲onNewIntent阻止我。謝謝 – user1697760

+0

我真的不明白爲什麼處理標籤ID 'onNewIntent'是「停止」(與你有區別)。 –

相關問題