본문 바로가기
Programming/Android Java

근거리 통신 - 나.NFC 데이터 전송

by 개Foot/Dog발?! 2014. 9. 28.

URL : http://onycomict.com/board/bbs/board.php?bo_table=class&wr_id=146


.....


NFC 로 통신하기 위해서는 2대의 폰끼리 뒷면을 접촉해야 하며 이때의 이벤트를 구해야 합니다. NfcAdapter.setNdefPushMessageCallback() 함수로 이벤트 리스너를 지정하면 2대의 NFC 단말이 서로를 인식했을 때 화면의 사이즈가 줄어드는데 이때 사용자가 화면을 터치하면 createNdefMessage() 라는 이벤트 함수가 실행됩니다. 이것은 NDEF 푸쉬 메시지 생성 이벤트 함수이며, 이 함수에서 NDEF 메시지를 생성해서 반환하면 상대편 NFC 디바이스로 전달됩니다.

NfcAdapter.setOnNdefPushCompleteCallback() 함수로 이벤트 리스너를 지정하면 데이터 전송이 완료되었을 때 onNdefPushComplete() 라는 이벤트 함수가 실행됩니다. 데이터 전송이 완료 되었을 때 화면에 결과를 표시하려면 이벤트 핸들러를 사용해서 UI 스레드로 이벤트를 다시 전달해야 합니다. 예제를 통해서 구체적인 방법을 알아보겠습니다.


(1) URI 데이터 전송
텍스트 데이터는 인코딩 과정이 약간 복잡해서 URI 데이터 전송 기능을 먼저 구현해 보겠습니다. NDEF 푸시 메시지를 전송 이벤트를 구하기 위해서 액티비티는 CreateNdefMessageCallback 을 상속받아야 합니다. URI 경로를 byte 배열로 변경할 때 US-ASCII 인코딩 형식으로 지정해야 하며, 1번째 byte 에는 1을 입력해야 합니다.


.....


3) /src/<패키지명>/MainActivity.java 파일을 열고 아래와 같이 새로운 코드를 추가합니다.


 

@Override

public NdefMessage createNdefMessage(NfcEvent event) {

        // 여러개의 NDEF 레코드를 모아서 하나의 NDEF 메시지를 생성  

    NdefMessage message = new NdefMessage( new NdefRecord[] {

       createTextRecord("Text sample record-1", Locale.ENGLISH),

       createTextRecord("한국어 sample record-2", Locale.KOREAN),

       createUriRecord("www.google.com"),

       createUriRecord("cafe.naver.com/tizenity")

    });

    return message;

}


.....


 


 

@Override

public void onNdefPushComplete(NfcEvent event) {

        // 핸들러에 메시지를 전달한다

    mHandler.obtainMessage(1).sendToTarget();

}


....


....


4) NFC 를 사용하려면 사용자 지정 권한이 필요합니다. AndroidManifest.xml 파일을 열고 아래와 같이 2줄의 코드를 추가합니다. NFC 칩을 사용하기 위해서 android.permission.NFC 퍼미션이 필요합니다. NFC 칩이 탑재된 폰에서만 앱을 검색할 수 있도록 하기 위해서 android.hardware.nfc 라는 uses-feature 를 추가합니다.


<uses-sdk

    android:minSdkVersion="14"

    android:targetSdkVersion="19" />

 

<uses-feature android:name="android.hardware.nfc" android:required="false" />

<uses-permission android:name="android.permission.NFC" />


* Android Beam(P2P)는 SDK 14인 Android 4.0 ICS부터 지원된다.


.....