2012-09-27 35 views
5

Tôi có một lớp học, tạo ra sự kết nối với NFC và hai hoạt động. Cả hai đều tạo ra một đối tượng của lớp đó để họ có thể kết nối với NFC. Trước đó nó đã làm việc bằng cách nào đó nhưng bây giờ tôi đã có vấn đề - ứng dụng của tôi không làm bất cứ điều gì onNewIntent, ngay cả trên các hoạt động đầu tiên. Thay vào đó, tôi có thể thấy "Thẻ mới được thu thập" từ ứng dụng tích hợp được gọi là "Thẻ" (Nexus S)."Thẻ mới được thu thập" thay vì đọc thẻ của ứng dụng - NFC android

Tôi nên làm gì?

lớp:

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

} 

hoạt động 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); 

} 

Trả lời

-2

Tôi đã nhìn thấy "Thẻ mới thu" từ xây dựng trong ứng dụng được gọi là "Thẻ" vì ứng dụng của tôi không hoạt động đúng.

Khi nó hoạt động tốt, nó có ưu tiên cao hơn "Thẻ" và điện thoại đọc thẻ từ ứng dụng của tôi. Nhưng khi nó hoạt động không hợp lý và điện thoại thu thập thẻ, ứng dụng "Thẻ" được kích hoạt và ứng dụng "Thẻ" nói chuyện với thiết bị của tôi.

Sau khi sửa mã, ứng dụng của tôi có mức độ ưu tiên cao hơn và điện thoại đọc thẻ bằng ứng dụng của tôi.

+5

Bạn đã làm cho nó hoạt động tốt như thế nào? –

+0

Nếu bạn vẫn gặp sự cố, hãy xem câu trả lời của tôi. – MagicSeth

+3

Thực sự không có bất kỳ dữ liệu hữu ích nào trong câu trả lời này. Chỉ cần nói "oh, tôi đã sửa ứng dụng của mình và giờ nó hoạt động" không nói cho cộng đồng biết bất cứ điều gì về _how_ ứng dụng đã được sửa và _what_ ban đầu bạn đã làm sai. – jwir3

5

Đến cài đặt -> Ứng dụng -> All -> Tags (trong trường hợp của tôi) -> vô hiệu hóa

+0

Đây không phải là giải pháp. Anh ta nên lọc các thẻ thích hợp trong danh sách công nghệ của mình hoặc sử dụng adapter.enableForegroundDispatch (this, pendingIntent, null, null); như được hiển thị trong câu trả lời hay dưới đây khi ứng dụng được đặt nền trước – John

3

Tôi đã có một vấn đề tương tự khi cố gắng để mở ứng dụng của tôi từ một thẻ NFC. Tôi đã đăng ký một intentfilter trong AndroidManifest.xml của tôi cho chương trình "magicnfc" nhưng nó đã mở ứng dụng Android OS Tags thay vì của tôi.

Tôi phát hiện ra rằng ý định NFC (TECH_DISCOVERED trong trường hợp của tôi) có mức ưu tiên cao hơn so với bộ lọc mục đích chung dựa trên lược đồ. Vì ứng dụng Thẻ đã đăng ký TECH_DISCOVERED, ứng dụng này đã được mở thay vì của tôi.

May mắn thay, các ứng dụng có thể đăng ký NDEF_DISCOVERED (bộ lọc ưu tiên cao hơn) và mở được thay vì ứng dụng Thẻ.

Điều đó làm cho ứng dụng của tôi mở khi tôi nhấn vào thẻ.

Thông tin thêm là ở đây: http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

Nhưng tôi thấy rằng tôi đã phải ghi đè lên các chức năng onNewIntent, với mã như thế này:

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]; 
     } 
    } 
} 

Đối với tôi, tất cả tôi cần là:

String uri = intent.getDataString(); 

Chúc bạn may mắn!

3

Bạn có thể nghe cho tất cả thẻ kích hoạt bằng cách sử dụng ACTION_TAG_DISCOVERED ý định, chứ không phải lọc cho một cụ thể với đoạn mã sau:

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

Từ NFCAdapter Documentation:

Nếu bạn vượt qua null cho cả bộ lọc và tham số techLists hoạt động với thẻ hoang dã và sẽ khiến hoạt động nền trước nhận tất cả các thẻ thông qua mục đích ACTION_TAG_DISCOVERED.

Các vấn đề liên quan