android - Why does NFC not working for my app right after installation? -
i using ndeftools library communicate nfc hardware. works fine except 1 issue right after app installed, nfc doesn't seem want return anything. makes nfc sound scanning nfc tag, nothing else happens. if exit app , scan tag, native nfc app activated usual. once device restarted, nfc function restored app on. wondering if has ran issue. appreciated.
edit: i'm including code use interface nfc library. reading tags, use enableforegroundmode() , works part except 1 scenario right after install. there more should doing?
public class nfchelper { private final string tag = nfchelper.class.getsimplename(); protected nfcadapter m_nfcadapter; protected pendingintent m_nfcpendingintent; private context m_context = null; public nfchelper(context p_context) { m_context = p_context; m_nfcadapter = nfcadapter.getdefaultadapter(m_context); m_nfcpendingintent = pendingintent.getactivity(m_context, 0, new intent(m_context, m_context.getclass()).addflags(intent.flag_activity_single_top), 0); } public void disableforegroundmode() { log.i(tag, "disableforegroundmode"); m_nfcadapter.disableforegrounddispatch((activity) m_context); } public void enableforegroundmode() { log.i(tag, "enableforegroundmode"); // foreground mode gives current active application priority reading scanned tags intentfilter tagdetected = new intentfilter(nfcadapter.action_tag_discovered); // filter tags intentfilter[] writetagfilters = new intentfilter[] {tagdetected}; m_nfcadapter.enableforegrounddispatch((activity) m_context, m_nfcpendingintent, writetagfilters, null); } public nfcadapter getnfcadapter() { return m_nfcadapter; } public simpleentry<string, string> getnfcdata(intent p_intent) { log.i(tag, "getnfcdata"); byte[] arrtagserial = null; string stagserial = ""; string stagcontent = ""; try { // check nfc related actions if (nfcadapter.action_tag_discovered.equals(p_intent.getaction())) { arrtagserial = p_intent.getbytearrayextra(nfcadapter.extra_id); stagserial = new biginteger(arrtagserial).tostring(16); parcelable[] messages = p_intent.getparcelablearrayextra(nfcadapter.extra_ndef_messages); if (messages != null) { log.d(tag, "found " + messages.length + " ndef messages"); //vibrate(); // parse records (int = 0; < messages.length; i++) { try { list<record> records = new message((ndefmessage)messages[i]); log.d(tag, "found " + records.size() + " records in message " + i); for(int k = 0; k < records.size(); k++) { log.d(tag, " record #" + k + " of class " + records.get(k).getclass().getsimplename()); record record = records.get(k); if (record instanceof textrecord) { textrecord txtrecord = (textrecord) records.get(k); stagcontent = txtrecord.gettext(); } else if(record instanceof androidapplicationrecord) { androidapplicationrecord aar = (androidapplicationrecord)record; log.d(tag, "package " + aar.getpackagename()); } } } catch (exception e) { log.e(tag, "problem parsing message", e); } } } } else { // ignore } } catch (exception ex) { ex.printstacktrace(); } return new simpleentry<string, string>(stagserial, stagcontent); } public boolean writetext(string text, intent intent) { message message = new message(); org.ndeftools.wellknown.textrecord textrecord = new org.ndeftools.wellknown.textrecord(); try { textrecord.settext(text); textrecord.setencoding(charset.forname("utf-8")); textrecord.setlocale(locale.english); message.add(textrecord); return writemessage(message, intent); } catch (exception ex) { ex.printstacktrace(); return false; } } public boolean writemessage(message message, intent intent) { return writemessage(message.getndefmessage(), intent); } public boolean writemessage(ndefmessage rawmessage, intent intent) { tag tag = intent.getparcelableextra(nfcadapter.extra_tag); ndefformatable format = ndefformatable.get(tag); if (format != null) { log.d(tag, "write unformatted tag"); try { format.connect(); format.format(rawmessage); //writendefsuccess(); return true; } catch (exception e) { //writendeffailed(e); } { try { format.close(); } catch (ioexception e) { // ignore } } log.d(tag, "cannot write unformatted tag"); } else { ndef ndef = ndef.get(tag); if (ndef != null) { try { log.d(tag, "write formatted tag"); ndef.connect(); if (!ndef.iswritable()) { log.d(tag, "tag not writeable"); //writendefnotwritable(); return false; } if (ndef.getmaxsize() < rawmessage.tobytearray().length) { log.d(tag, "tag size small, have " + ndef.getmaxsize() + ", need " + rawmessage.tobytearray().length); //writendeftoosmall(rawmessage.tobytearray().length, ndef.getmaxsize()); return false; } ndef.writendefmessage(rawmessage); //writendefsuccess(); return true; } catch (exception e) { //writendeffailed(e); } { try { ndef.close(); } catch (ioexception e) { // ignore } } } else { //writendefcannotwritetech(); } log.d(tag, "cannot write formatted tag"); } return false; } public int getmaxndefsize(intent intent) { tag tag = intent.getparcelableextra(nfcadapter.extra_tag); ndefformatable format = ndefformatable.get(tag); if (format != null) { log.d(tag, "format tag empty message"); try { if (!format.isconnected()) { format.connect(); } format.format(new ndefmessage(new ndefrecord[0])); } catch (exception e) { log.d(tag, "problem checking tag size", e); return -1; } } ndef ndef = ndef.get(tag); if (ndef != null) { try { if (!ndef.isconnected()) { ndef.connect(); } if (!ndef.iswritable()) { log.d(tag, "capacity of non-writeable tag zero"); //writendefnotwritable(); return 0; } int maxsize = ndef.getmaxsize(); ndef.close(); return maxsize; } catch (exception e) { log.d(tag, "problem checking tag size", e); } } else { //writendefcannotwritetech(); } log.d(tag, "cannot size of tag"); return -1; } } edit2: here code of activity uses nfchelper:
private nfchelper mnfc = new nfchelper(this); @override public void onnewintent(intent intent) { simpleentry<string, string> nfcdata = null; // if intent nfc tag scan if (intent.getaction() != null && intent.getaction().equals(nfcadapter.action_tag_discovered)) { nfcdata = mnfc.getnfcdata(intent); // stuff nfc data } } @override protected void onresume() { super.onresume(); mnfc.enableforegroundmode(); } @override protected void onpause() { super.onresume(); mnfc.disableforegroundmode(); }
Comments
Post a Comment