2012-09-27 26 views
5

मेरे पास एक कक्षा है, जो एनएफसी और दो सक्रियताओं के लिए संयोजन बनाती है। उनमें से दोनों उस वर्ग का एक वस्तु बनाते हैं ताकि वे एनएफसी से जुड़ सकें। इससे पहले कि यह किसी भी तरह से काम करता था लेकिन अब मुझे समस्या है - मेरा आवेदन पहले गतिविधि पर भी, न्यूइन्टेंट पर कुछ भी नहीं करता है। इसके बजाय, मैं "टैग" (नेक्सस एस) नामक बिल्ड-इन ऐप से "नया टैग एकत्रित" देख सकता हूं।आवेदन के टैग पढ़ने के बजाय "नया टैग एकत्रित" - एनएफसी एंड्रॉइड

मुझे क्या करना चाहिए?

वर्ग:

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

इस उत्तर में वास्तव में कोई उपयोगी डेटा नहीं है। बस "ओह, मैंने अपना ऐप सही किया और अब यह काम करता है" समुदाय को कुछ भी नहीं बताता है कि _how_ ऐप को सही किया गया था और _what_ आप शुरू में गलत तरीके से कर रहे थे। – jwir3

5

जाओ सेटिंग्स के लिए -> ऐप्लिकेशन -> सभी -> टैग (मेरे मामले में) -> को निष्क्रिय

+0

यह समाधान नहीं है। उसे अपने टैग-सूचियों में उचित टैग फ़िल्टर करना चाहिए, या adapter.enableForeground डिस्प्ले (यह, लंबित इंटेंट, शून्य, शून्य) का उपयोग करना चाहिए; जैसा कि ऐप अग्रभूमि है, नीचे दिए गए अच्छे उत्तर में दिखाया गया है – John

3

मैं जब NFC टैग से मेरे ऐप खोलने की कोशिश कर एक ऐसी ही समस्या थी। मैंने "animnfc" योजना के लिए अपने AndroidManifest.xml में एक intentfilter पंजीकृत किया था और फिर भी उसने मेरे बजाय एंड्रॉइड ओएस टैग ऐप खोला था।

मुझे पता चला कि एनएफसी इरादा (मेरे मामले में 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 से:

यदि आप पारित फिल्टर और टेकलिस्ट पैरामीटर दोनों के लिए शून्य जो वाइल्ड कार्ड कार्य करता है और अग्रभूमि गतिविधि को ACTION_TAG_DISCOVERED मंशा के माध्यम से सभी टैग प्राप्त करने का कारण बनता है।