투케이2K

940. (Android/Java) [간단 소스] 안드로이드 onNewIntent 에서 NFC 카드 태깅 TAG , NDEF 메시지 확인 코드 본문

Android

940. (Android/Java) [간단 소스] 안드로이드 onNewIntent 에서 NFC 카드 태깅 TAG , NDEF 메시지 확인 코드

투케이2K 2025. 1. 16. 20:05

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin

- 개발 툴 : AndroidStudio

- 기술 구분 : Nfc / Card / Tag / Ndef / Tech

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[사전) 필요 설정]
// --------------------------------------------------------------------------------------

/**
  * // -------------------------------------------------------
  * 1. 필요 퍼미션 :
  *
  * <uses-permission android:name="android.permission.NFC"/>
  * <uses-feature android:name="android.hardware.nfc" android:required="true" />
  * // -------------------------------------------------------
  * 2. 참고 사이트 :
  *
  * UID 및 NDEF 메시지 읽기, 쓰기 : https://blog.naver.com/kkh0977/223128033201?trackingCode=blog_bloghome_searchlist
  *
  * 마이페어 카드 섹터 블럭 읽기 : https://blog.naver.com/kkh0977/223015747045
  *
  * 안드로이드 어댑터 클래스 : https://developer.android.com/reference/android/nfc/NfcAdapter
  * // -------------------------------------------------------
  * */

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

@Override
protected void onNewIntent(Intent intent){
    super.onNewIntent(intent);

    if (intent != null){

      // -------------------------------------------------
      // TODO [NFC 태그 ID 데이터 읽기]
      // -------------------------------------------------
      Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
      byte[] tagId = null;

      if (tag != null){
          tagId = tag.getId();
      }
      // -------------------------------------------------


      // -------------------------------------------------
      // TODO [NDEF 메시지 읽기]
      // -------------------------------------------------
      Parcelable[] rawMessage = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
      String payloadStr = "";

      if (rawMessage != null){
          NdefMessage[] messages = new NdefMessage[rawMessage.length];

          for (int i=0; i<messages.length; i++){
              messages[i] = (NdefMessage) rawMessage[i];
          }

          for (int i=0; i<messages.length; i++){

              try {
                  NdefRecord[] records = messages[i].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";
                      }

                      // TODO [Get the Language Code]
                      int languageCodeLength = payload[0] & 0077;
                      String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");

                      // TODO [Get the Text]
                      payloadStr = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
                  }
              }
              catch (Exception e){}

          }
      }
      // -------------------------------------------------


      // -------------------------------------------------
      // TODO [JSON 데이터 포맷]
      // -------------------------------------------------
      try {
          JSONObject jsonObject = new JSONObject();

          // ---------------------------------------------

          if (tagId != null && tagId.length > 0){ // TODO [태그 ID]

              String hexTagId = C_Encryption.byteToHex(tagId);
              hexTagId = hexTagId.replaceAll("0x", "");
              hexTagId = hexTagId.replaceAll("0X", "");
              hexTagId = hexTagId.replaceAll(" ", "");

              jsonObject.put(NFC_HEX_TAG_ID, hexTagId);
          }
          else {
              jsonObject.put(NFC_HEX_TAG_ID, "");
          }

          // ---------------------------------------------

          if (C_Util.stringNotNull(payloadStr) == true){ // TODO [NDEF 메시지]
              jsonObject.put(NFC_STRING_NDEF_MSG, payloadStr);
          }
          else {
              jsonObject.put(NFC_STRING_NDEF_MSG, "");
          }

          // ---------------------------------------------

          S_Log._D_(ACTIVITY_NAME + " : NFC Read Data >>>>>>>>>>>", new String[]{ jsonObject.toString() });

          // ---------------------------------------------

      }
      catch (Exception et){
          et.printStackTrace();
      }

  }
}

// --------------------------------------------------------------------------------------




// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

UID 및 NDEF 메시지 읽기, 쓰기 : https://blog.naver.com/kkh0977/223128033201?trackingCode=blog_bloghome_searchlist

마이페어 카드 섹터 블럭 읽기 : https://blog.naver.com/kkh0977/223015747045

안드로이드 어댑터 클래스 : https://developer.android.com/reference/android/nfc/NfcAdapter

NFC 기능 활성 및 카드 Read , Write 관련 모듈 : https://blog.naver.com/kkh0977/223607573751?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
반응형
Comments