Android/NFC | Posted by 덩치 2014. 9. 26. 11:33

NFC 태그 읽기(Read)

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

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 읽기 -


태그 정보는 onNewIntentOverride 하거나 onResume 에서 받을 수 있다.


아무데서나 태그 읽기를 구현할 수 있다.


onNewIntentIntent 값을 리턴해주며, 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));

}

}


이렇게 태그의 주요 정보를 읽을 수 있다.


다음 포스팅에서는 태그 쓰기에 대해 다루겠다.  끝





'Android > NFC' 카테고리의 다른 글

NFC 태그 쓰기(Write)  (0) 2014.09.26
NFC란 ?  (0) 2014.09.25