Skip to content
This repository was archived by the owner on Feb 20, 2025. It is now read-only.

Commit febabae

Browse files
committed
minor corrections for new NFC Beam
1 parent a9e746b commit febabae

File tree

2 files changed

+10
-272
lines changed

2 files changed

+10
-272
lines changed

SensorDemos/res/layout/nfc40.xml

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,6 @@
3737
android:textColor="#000"
3838
android:text="Beam Now"
3939
/>
40-
<TextView
41-
android:id="@+id/tagid"
42-
android:layout_width="fill_parent"
43-
android:layout_height="wrap_content"
44-
android:padding="10dp"
45-
android:textColor="#000"
46-
android:text="TagID: UNKNOWN"
47-
/>
48-
<TextView
49-
android:id="@+id/tagtype"
50-
android:layout_width="fill_parent"
51-
android:layout_height="wrap_content"
52-
android:padding="10dp"
53-
android:textColor="#000"
54-
android:text="TagType: UNKNOWN"
55-
/>
5640
<TextView
5741
android:id="@+id/tagdata"
5842
android:layout_width="fill_parent"
Lines changed: 10 additions & 256 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.oreilly.demo.android.pa.sensordemo;
22

33
import java.nio.charset.Charset;
4-
import java.util.Arrays;
54

65
import android.app.Activity;
76
import android.content.Intent;
@@ -27,7 +26,7 @@ public NdefMessage createNdefMessage(NfcEvent event) {
2726
};
2827

2928
private NdefMessage createNDFMsg(boolean now) {
30-
String text = "Beam "+(now ? "NOW" : "ON")+" com.oreilly.demo.android.pa.sensordemo.NFC40 Beam with" + (AARUSE ? "" : "out") + " AAR Use";
29+
String text = "Beam "+(now ? "NOW" : "ON")+" com.oreilly.demo.android.pa.sensordemo Beam with" + (AARUSE ? "" : "out") + " AAR Use";
3130
byte[] mimeBytes = "application/com.oreilly.demo.android.pa.sensordemo".getBytes(Charset.forName("US-ASCII"));
3231
NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], text.getBytes());
3332

@@ -87,21 +86,15 @@ public void onClick(View v) {
8786
findViewById(R.id.beamon).setVisibility(View.GONE);
8887
findViewById(R.id.beamnow).setVisibility(View.GONE);
8988

90-
findViewById(R.id.tagtype).setVisibility(View.VISIBLE);
91-
findViewById(R.id.tagid).setVisibility(View.VISIBLE);
9289
findViewById(R.id.tagdata).setVisibility(View.VISIBLE);
9390

9491
analyzeIntent(getIntent());
9592
} else if(NfcAdapter.getDefaultAdapter(this) == null || !NfcAdapter.getDefaultAdapter(this).isEnabled()) {
9693
findViewById(R.id.beamon).setVisibility(View.GONE);
9794
findViewById(R.id.beamnow).setVisibility(View.GONE);
98-
findViewById(R.id.tagtype).setVisibility(View.GONE);
99-
findViewById(R.id.tagdata).setVisibility(View.GONE);
10095

101-
((TextView) findViewById(R.id.tagid)).setText("NFC not enabled!");
96+
((TextView) findViewById(R.id.tagdata)).setText("NFC not enabled!");
10297
} else {
103-
findViewById(R.id.tagtype).setVisibility(View.GONE);
104-
findViewById(R.id.tagid).setVisibility(View.GONE);
10598
findViewById(R.id.tagdata).setVisibility(View.GONE);
10699

107100
findViewById(R.id.beamon).setVisibility(View.VISIBLE);
@@ -120,257 +113,18 @@ public void onClick(View v) {
120113
}
121114
});
122115
}
123-
}catch (Exception t) {
124-
((TextView) findViewById(R.id.tagid)).setText("ERROR: "+t.toString());
116+
} catch (Exception t) {
117+
findViewById(R.id.tagdata).setVisibility(View.VISIBLE);
118+
((TextView) findViewById(R.id.tagdata)).setText("ERROR: "+t.toString());
119+
t.printStackTrace();
125120
}
126121
}
127122

128-
129-
// From here on down is the same code as in com.oreilly.demo.android.pa.sensordemo.NFC
130-
private static enum NFCType {
131-
UNKNOWN, TEXT, URI, SMART_POSTER, ABSOLUTE_URI
132-
}
133-
134-
private void analyzeIntent(final Intent intent) {
123+
private void analyzeIntent(final Intent intent) {
135124
if(intent == null) return;
136-
137-
String id = getTagId(intent);
138-
NFCType type = NFCType.UNKNOWN;
139-
String datastr = null;
140-
byte[] data = null;
141-
142-
NdefMessage tag = getTagData(intent);
143-
if(tag != null) {
144-
type = getTagType(tag);
145-
if(type != NFCType.UNKNOWN) {
146-
datastr = getTagData(tag);
147-
} else data = getTagRawData(tag);
148-
}
149-
150-
if(datastr != null) updateViewInfo(id, type, datastr);
151-
else updateViewInfo(id, type, data);
152-
}
153-
154-
private void updateViewInfo(String id, NFCType type, byte[] data) {
155-
updateViewInfo(id, type, data != null ? getHexString(data) : null);
156-
}
157-
158-
private void updateViewInfo(String id, NFCType type, String data) {
159-
if(id != null) {
160-
((TextView) findViewById(R.id.tagid)).setText("TagID: "+id);
161-
}
162-
163-
if(type != NFCType.UNKNOWN) {
164-
String typestr = "";
165-
switch(type) {
166-
case TEXT: typestr = "Text"; break;
167-
case SMART_POSTER: typestr = "Smart Poster"; break;
168-
case URI: typestr = "URI"; break;
169-
case ABSOLUTE_URI: typestr = "URI (Abs)"; break;
170-
default: typestr = "UNKNOWN";
171-
break;
172-
}
173-
((TextView) findViewById(R.id.tagtype)).setText("TagType: "+typestr);
174-
}
175-
176-
if(data != null) {
177-
((TextView) findViewById(R.id.tagdata)).setText("TagData:\n"+data);
178-
}
179-
}
180-
181-
private String getTagId(final Intent intent) {
182-
if(intent == null) return null;
183-
byte[] byte_id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
184-
if(byte_id == null) return null;
185-
186-
return getHexString(byte_id);
187-
}
188-
189-
private NdefMessage getTagData(final Intent intent) {
190-
if(intent == null || !intent.hasExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) return null;
191-
125+
findViewById(R.id.tagdata).setVisibility(View.VISIBLE);
126+
192127
Parcelable[] msgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
193-
194-
if(msgs == null || msgs.length < 1) {
195-
return null;
196-
}
197-
198-
NdefMessage[] nmsgs = new NdefMessage[msgs.length];
199-
for(int i=0;i<msgs.length;i++) {
200-
nmsgs[i] = (NdefMessage) msgs[i];
201-
}
202-
203-
// we will only grab the first msg as we are handling only 1 tag at the moment
204-
return nmsgs[0];
205-
}
206-
207-
private NFCType getTagType(final NdefMessage msg) {
208-
if(msg == null) return null;
209-
// we are only grabbing the first recognizable item
210-
211-
for (NdefRecord record : msg.getRecords()) {
212-
if(record.getTnf() == NdefRecord.TNF_WELL_KNOWN) {
213-
if(Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
214-
return NFCType.TEXT;
215-
}
216-
if(Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
217-
return NFCType.URI;
218-
}
219-
if(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)) {
220-
return NFCType.SMART_POSTER;
221-
}
222-
} else if(record.getTnf() == NdefRecord.TNF_ABSOLUTE_URI) {
223-
return NFCType.ABSOLUTE_URI;
224-
}
225-
}
226-
return null;
227-
}
228-
229-
private String getTagData(final NdefMessage msg) {
230-
if(msg == null) return null;
231-
// we are only grabbing the first recognizable item
232-
233-
for(NdefRecord record : msg.getRecords()) {
234-
if(record.getTnf() == NdefRecord.TNF_WELL_KNOWN) {
235-
if(Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
236-
return getText(record.getPayload());
237-
}
238-
if(Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
239-
return getURI(record.getPayload());
240-
}
241-
if(Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)) {
242-
if(record.getPayload() == null || record.getPayload().length < 1) return null;
243-
try {
244-
NdefMessage subrecords = new NdefMessage(record.getPayload());
245-
return getSubRecordData(subrecords.getRecords());
246-
} catch (Exception e) {
247-
e.printStackTrace();
248-
return null;
249-
}
250-
}
251-
} else if(record.getTnf() == NdefRecord.TNF_ABSOLUTE_URI) {
252-
return getAbsoluteURI(record.getPayload());
253-
}
254-
}
255-
return null;
256-
}
257-
258-
private String getSubRecordData(final NdefRecord[] records) {
259-
if(records == null || records.length < 1) return null;
260-
String data = "";
261-
for(NdefRecord record : records) {
262-
if(record.getTnf() == NdefRecord.TNF_WELL_KNOWN) {
263-
if(Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
264-
data += getText(record.getPayload()) + "\n";
265-
}
266-
if(Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
267-
data += getURI(record.getPayload()) + "\n";
268-
} else {
269-
data += "OTHER KNOWN DATA\n";
270-
}
271-
} else if(record.getTnf() == NdefRecord.TNF_ABSOLUTE_URI) {
272-
data += getAbsoluteURI(record.getPayload()) + "\n";
273-
} else data += "OTHER UNKNOW DATA\n";
274-
}
275-
return data;
276-
}
277-
278-
private byte[] getTagRawData(final NdefMessage msg) {
279-
if(msg == null || msg.getRecords().length < 1) return null;
280-
// we are only grabbing the first item
281-
return msg.getRecords()[0].getPayload();
282-
}
283-
284-
/*
285-
* the First Byte of the payload contains the "Status Byte Encodings" field, per the NFC Forum "Text Record Type Definition" section 3.2.1.
286-
*
287-
* Bit_7 is the Text Encoding Field.
288-
* * if Bit_7 == 0 the the text is encoded in UTF-8 else if Bit_7 == 1 then the text is encoded in UTF16
289-
* Bit_6 is currently always 0 (reserved for future use)
290-
* Bits 5 to 0 are the length of the IANA language code.
291-
*/
292-
private String getText(final byte[] payload) {
293-
if(payload == null) return null;
294-
try {
295-
String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
296-
int languageCodeLength = payload[0] & 0077;
297-
return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
298-
} catch (Exception e) {
299-
e.printStackTrace();
300-
}
301-
return null;
302-
}
303-
304-
private String getAbsoluteURI(final byte[] payload) {
305-
if(payload == null) return null;
306-
return new String(payload, Charset.forName("UTF-8"));
307-
}
308-
309-
/**
310-
* the First Byte of the payload contains the prefix byte
311-
*/
312-
private String getURI(final byte[] payload) {
313-
if(payload == null || payload.length < 1) return null;
314-
String prefix = convertUriPrefix(payload[0]);
315-
return (prefix != null ? prefix : "" ) + new String(Arrays.copyOfRange(payload, 1,payload.length));
316-
}
317-
318-
/**
319-
* NFC Forum "URI Record Type Definition"
320-
*
321-
* Conversion of prefix based on section 3.2.2 of the NFC Forum URI Record Type Definition document.
322-
*/
323-
private String convertUriPrefix(final byte prefix) {
324-
if(prefix == (byte) 0x00) return "";
325-
else if(prefix == (byte) 0x01) return "http://www.";
326-
else if(prefix == (byte) 0x02) return "https://www.";
327-
else if(prefix == (byte) 0x03) return "http://";
328-
else if(prefix == (byte) 0x04) return "https://";
329-
else if(prefix == (byte) 0x05) return "tel:";
330-
else if(prefix == (byte) 0x06) return "mailto:";
331-
else if(prefix == (byte) 0x07) return "ftp://anonymous:anonymous@";
332-
else if(prefix == (byte) 0x08) return "ftp://ftp.";
333-
else if(prefix == (byte) 0x09) return "ftps://";
334-
else if(prefix == (byte) 0x0A) return "sftp://";
335-
else if(prefix == (byte) 0x0B) return "smb://";
336-
else if(prefix == (byte) 0x0C) return "nfs://";
337-
else if(prefix == (byte) 0x0D) return "ftp://";
338-
else if(prefix == (byte) 0x0E) return "dav://";
339-
else if(prefix == (byte) 0x0F) return "news:";
340-
else if(prefix == (byte) 0x10) return "telnet://";
341-
else if(prefix == (byte) 0x11) return "imap:";
342-
else if(prefix == (byte) 0x12) return "rtsp://";
343-
else if(prefix == (byte) 0x13) return "urn:";
344-
else if(prefix == (byte) 0x14) return "pop:";
345-
else if(prefix == (byte) 0x15) return "sip:";
346-
else if(prefix == (byte) 0x16) return "sips:";
347-
else if(prefix == (byte) 0x17) return "tftp:";
348-
else if(prefix == (byte) 0x18) return "btspp://";
349-
else if(prefix == (byte) 0x19) return "btl2cap://";
350-
else if(prefix == (byte) 0x1A) return "btgoep://";
351-
else if(prefix == (byte) 0x1B) return "tcpobex://";
352-
else if(prefix == (byte) 0x1C) return "irdaobex://";
353-
else if(prefix == (byte) 0x1D) return "file://";
354-
else if(prefix == (byte) 0x1E) return "urn:epc:id:";
355-
else if(prefix == (byte) 0x1F) return "urn:epc:tag:";
356-
else if(prefix == (byte) 0x20) return "urn:epc:pat:";
357-
else if(prefix == (byte) 0x21) return "urn:epc:raw:";
358-
else if(prefix == (byte) 0x22) return "urn:epc:";
359-
else if(prefix == (byte) 0x23) return "urn:nfc:";
360-
return null;
361-
}
362-
363-
364-
private final static char[] HEX = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
365-
366-
// convert bytes to a hex string
367-
private static String getHexString(final byte[] bytes) {
368-
StringBuffer hex = new StringBuffer(bytes.length * 2);
369-
for (int i = 0; i < bytes.length; i++) {
370-
for (int j = 1; j >= 0; j--) {
371-
hex.append(HEX[(bytes[i] >> (j * 4)) & 0xF]);
372-
}
373-
}
374-
return hex.toString();
128+
((TextView) findViewById(R.id.tagdata)).setText(new String(((NdefMessage) msgs[0]).getRecords()[0].getPayload()));
375129
}
376130
}

0 commit comments

Comments
 (0)