NFC 하드웨어에 접근하기 위한 엘리먼트 -
<uses-permission android:name="android.permission.NFC" />
NFC를 지원하는 SDK 버전 -
API Level 9 - ACTION_TAG_DISCORVERED 만 지원
API Level 10 - EXTRA_NDEF_MESSAGES extra를 통해 NDEF 메시지에 접근 가능
- 다른 태그의 프로퍼티와 I/O 연산 미지원
API Level 14 - 포괄적인 Read/Write 지원
- Foreground NDEF 푸싱 지원
- NDEF 레코드를 생성하기 위한여러 메소드 지원
NFC 읽기 -
태그 정보는 onNewIntent를 Override 하거나 onResume 에서 받을 수 있다.
아무데서나 태그 읽기를 구현할 수 있다.
onNewIntent는 Intent 값을 리턴해주며, onResume에서는 getIntent로 태그정보를 받을 수 있다.
NfcAdapter 클래스를 이용하여 NFC 지원/미지원을 판단할 수 있다.
mNfcAdapter = NfcAdapter.getDefaultAdapter(this) ;
if (mNfcAdapter == null) {
// NFC 미지원단말
Toast.makeText(getApplicationContext(), "NFC를 지원하지 않는 단말기입니다.", Toast.LENGTH_SHORT).show();
return;
}
먼저 TAG의 스팩에 대해알아보자
(아래부터는 onResume() 또는 onNewIntent(Intent intent)에 아래와같은 작업을 수행한다)
Tag myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndefTag = Ndef.get(myTag);
// 태그 크기
int size = ndefTag.getMaxSize();
// 쓰기 가능 여부
boolean writable = ndefTag.isWritable();
// 태그 타입
String type = ndefTag.getType();
// 태그 ID
String id = byteArrayToHexString(myTag.getId());
public static String byteArrayToHexString(byte[] b) {
int len = b.length;
String data = new String();
for (int i = 0; i < len; i++){
data += Integer.toHexString((b[i] >> 4) & 0xf);
data += Integer.toHexString(b[i] & 0xf);
}
return data;
}
다음은 실제 TAG의 메시지를 확인한다
@Override
protected void onResume() {
super.onResume();
Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages == null) return;
for (int i = 0; i < messages.length; i++)
setReadTagData((NdefMessage)messages[0]);
}
public void setReadTagDataa(NdefMessage ndefmsg) {
if(ndefmsg == null ) {
return ;
}
String msgs = "";
msgs += ndefmsg.toString() + "\n";
NdefRecord [] records = ndefmsg.getRecords() ;
for(NdefRecord rec : records) {
byte [] payload = rec.getPayload() ;
String textEncoding = "UTF-8" ;
if(payload.length > 0)
textEncoding = ( payload[0] & 0200 ) == 0 ? "UTF-8" : "UTF-16";
Short tnf = rec.getTnf();
String type = String.valueOf(rec.getType());
String payloadStr = new String(rec.getPayload(), Charset.forName(textEncoding));
}
}
이렇게 태그의 주요 정보를 읽을 수 있다.
다음 포스팅에서는 태그 쓰기에 대해 다루겠다. 끝