Hyeyeon blog

[Android] NFC on, off 상태 확인 (기본모드, 카드모드, 비활성화) 본문

개발/Android

[Android] NFC on, off 상태 확인 (기본모드, 카드모드, 비활성화)

Hyeyeon.P 2022. 6. 23. 18:00
반응형

1. NFCAdapter를 사용한 NFC 활성화, 비활성화 상태 확인

기본적인 NFC의 on, off 상태 확인은 아래와 같이 가능하다.

import android.nfc.NfcAdapter;

val nfcAdapter : NfcAdapter = NfcAdapter.getDefaultAdapter(context)
val isNfcOn : Boolean = nfcAdapter.isEnabled()

그러나 NFC가 on이어도 일반모드 일때만 true를 반환하고 카드모드 일때는 NFC off와 동일하게 false를 반환한다.

Android에서 NFC의 모드를 구분할 수 있는 메소드가 제공되지 않기 때문에, BroadcastReceiver를 사용하여 상태 값으로 구분이 가능하다. 

2. BroadcastReceiver를 사용한 NFC 상태 확인

NFC의 상태가 변할 때 리시버가 호출되어 state 값을 확인할 수 있다.

활성화, 비활성화에 따른 상태 값의 변화는 아래와 같다. 

1. 비활성화 -> 기본모드 활성화: STATE_TURNING_ON -> STATE_ON

2. 기본모드 -> 카드모드 활성화: null 혹은 5

3. 카드모드 활성화 -> 비활성화: STATE_TURNING_OFF -> STATE_OFF

val receiver = object : BroadcastReceiver() {
    override fun onReceive(con: Context?, intent: Intent) {
        val action = intent.action
	
        if (action == NfcAdapter.ACTION_ADAPTER_STATE_CHANGED) {
            val state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF)
            when (state) {
                NfcAdapter.STATE_OFF -> { /* NFC 비활성화 */ }
                NfcAdapter.STATE_TURNING_OFF -> { /* NFC 비활성화 전환 */ }
                NfcAdapter.STATE_ON -> { /* NFC 일반모드 활성화 */ }
                NfcAdapter.STATE_TURNING_ON -> { /* NFC 활성화 전환 */ }
                else -> { /* NFC 카드모드 활성화 등 */ }
            }
        }
    }
}

3. BroadcastReceiver 등록, 해지

위와 같이 생성한 리시버를 아래와 같이 onResume() 혹은 onStart()에서 등록하여 사용한다.

context.registerReceiver(receiver, IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED))

해지 시에는 onPause() 혹은 onStop()에서 아래와 같이 호출한다.

* onDestoy()는 호출된다는 보장이 없어서 onDestroy()에서 호출할 경우에 메모리 누수가 발생할 수 있다.

context.unregisterReceiver(receiver)
728x90
Comments