마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

핸드폰 뒤 nfc 태그를 접촉 시켰는지에 관한 여부를 판단하는 방법 질문드립니다.

0 추천

현재 nfc 관련 앱을 독학하고 있는데

웹상의 예제들을 보면서 기본적인 NFC 데이터 쓰기 읽기를 배웠습니다.

 

 

nfc 태그가 핸드폰에 가까이 왔을때 nfc 데이터를 읽는것 뿐만 아니라

태그가 핸드폰에서 띄워졌을때를 판단하고 싶은데

 

제가 생각하기에는 현제 코드에서 enableForegroundDispatch 속의 intent filter가 nfc 태그가 발견됬을때를 조건으로 하여 제거 되는 경우를 잡지 못하고 있는거 같은데 참고할만한 예제가 잘 찾아지지 않습니다.

 

안드로이드 docu에서 Action_Adapter_State_Changed 를 보고, 현 intent filter속에 action_ndef_discovered를 대체 하는 식으로 사용 해보았지만 잘 작동이 안되는거 같습니다. 도움 주시면 감사하겠습니다

 

아래는 현제 mainactivity 입니다.

 

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView)findViewById(R.id.textMessage);
    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

    mTextView.setText(“SCAN!”);

    Intent intent = new Intent(this, getClass());
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    mPendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    IntentFilter iFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

/// 이 인텐트 필터가 nfc 태그가 발견 되었을때만 필터하여 ///

    try {
        iFilter.addDataType("*/*");
        mIntentFilters = new IntentFilter[] { iFilter };
    } catch (Exception e) {
        mTextView.setText(“Filter Error”);
    }
    mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}

public void onResume() {
    super.onResume();
    if( mNfcAdapter != null ) {
        mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists);

/// 여기서 nfc 태그가 발견될경우 한번만 실행하게 만드는거 같은데 ///

/// NFC 태그가 발견되었을경우 Text가 nfc 내 data를 표시하고, 제거 하였을 경우 다시 그 데이터를 지우고 원래 Scan!을 띄우고 대기하고 싶습니다. Nfc 태그가 더 이상 인식이 되지 않는다 – 태그가 분리되었다를 인식하는 방법이 있을까요? ///
    }

    if( NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction()) ) {
        onNewIntent(getIntent());
    }
}

 

 

 

------------ 이후 nfc 태그 정보 읽기 ---------

public void onNewIntent(Intent intent) {

        Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

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

    public void showMsg(NdefMessage mMessage) {
        String strRec="";

        NdefRecord[] recs = mMessage.getRecords();
        for (int i = 0; i < recs.length; i++) {

            NdefRecord record = recs[i];
            byte[] payload = record.getPayload();

            if( Arrays.equals(record.getType(), NdefRecord.RTD_TEXT) ) {
                strRec = byteDecoding(payload);
            }

            else if( Arrays.equals(record.getType(), NdefRecord.RTD_URI) ) {
                strRec = new String(payload, 0, payload.length);
            }
        }
        mTextView.setText(strRec);

        // nfc 태그 정보 표시 //
        }
    }

    public String byteDecoding(byte[] buf) {
        String strText="";
        String textEncoding = ((buf[0] & 0200) == 0) ? "UTF-8" : "UTF-16";
        int langCodeLen = buf[0] & 0077;

        try {
            strText = new String(buf, langCodeLen + 1,
                    buf.length - langCodeLen - 1, textEncoding);
        } catch(Exception e) {
            Log.d("TAG", e.toString());
        }
        return strText;
    }
}

 

요약하자면 현재는

제가 태그를 되면 nfc 태그 정보가 text로 표시가 됩니다.

하지만 태그를 제거하여도 여전히 그 nfc 태그 정보가 표시되고 있습니다.

 

nfc 태그를 붙이고 있을때만 정보가 표시되고 제거 하였을 경우 다시 기존에 "Scan!"이라는 글을 띄워두고 싶습니다.

 

도움주시면 정말 감사하겠습니다

gromhell9 (120 포인트) 님이 2016년 4월 15일 질문

1개의 답변

0 추천
블럭 (1,700 포인트) 님이 2016년 4월 15일 답변
...