'태그'에 해당되는 글 2

  1. 2014.09.26 NFC 태그 쓰기(Write)
  2. 2014.09.26 NFC 태그 읽기(Read)
Android/NFC | Posted by 덩치 2014. 9. 26. 17:02

NFC 태그 쓰기(Write)

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

이전 포스팅 NFC 태그 읽기 에 이어서 쓰기에 대해 알아보자


NFCWrite하기 위해서는 NDEF Message를 구성해야한다. (참고 : http://biig.tistory.com/77)


참고 글을 봤다면 NDEF Message가 어떻게 구성되는지는 다 알것이고 설명은 생략하겠다.



우선, NFC 관련 객체를 생성한다.


public static final int TYPE_TEXT = 1;

public static final int TYPE_URI = 2;


EditText mWriteText;

NfcAdapter mNfcAdapter;

PendingIntent mPendingIntent;


protected void onCreate(Bundle saveInstanceState) {


mWriteText = (EditText) findViewById(R.id.et_write);

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

Intent inent = new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

mPendingIntent = PendingIntent.getActivity(this,0,intent,0);


}


다음, 이전 글에서 설명했듯이 태그를 인식하게되면 onNewIntent 메소드가 호출된다.


onNewIntent가 호출되면 태그에 실제로 값을 Write하는 작업을 수행해야한다.


@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

if (intent == null)

return;


Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

writeTag(getTextAsNdef(), detectedTag);


}


private NdefMessage getTextAsNdef() { 


byte[] textBytes = mWriteText.getText().toString().getBytes();


NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, 

"text/plain".getBytes(),

new byte[] {}, 

textBytes);

return new NdefMessage(new NdefRecord[] {textRecord});

}


private NdefMessage getUriAsNdef() { 


byte[] textBytes = mWriteText.getText().toString().getBytes();


NdefRecord record1 = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,

new String("U").getBytes(Charset.forName("US-ASCII")),

new byte[0],

textBytes) ;

return new NdefMessage(new NdefRecord[] {textRecord});

}


private void toast(String text) {

Log.i("fureun","toast");

Toast.makeText(this, text, Toast.LENGTH_SHORT).show();

}


이렇게 하면 기본적인 Write가 완료가 된다. 이후 Read를 하게되면 자신이 입력한 태그의 정보를 확인할 수 있다.



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

NFC 태그 읽기(Read)  (0) 2014.09.26
NFC란 ?  (0) 2014.09.25
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