먼저 NFC 기능을 사용하려면 AndroidManifest.xml 파일에 다음 권한을 추가해야 한다
<uses-permission android:name="android.permission.NFC" />
nfc adapter를 가져와서 NFC가 활성화되어 있는지 확인해야 한다.
다음 코드를 사용하여 NFC adapter를 가져와서 NFC가 활성화되어 있는지 확인할 수 있다.
val adapter = NfcAdapter.getDefaultAdapter(this)
if (adapter == null) {
// NFC가 지원되지 않는 기기입니다.
return
}
if (!adapter.isEnabled) {
// NFC가 비활성화되어 있습니다. 사용자에게 활성화를 요청합니다.
val intent = Intent(Settings.ACTION_NFC_SETTINGS)
startActivity(intent)
}
NFC 태그에 데이터를 쓰려면 NFC 태그가 활성화되고 읽기/쓰기 모드가 되어 있어야 한다.
이를 위해서는 NFC 태그가 탐지되면 태그를 처리하는 새로운 인텐트를 처리해야 한다.
이를 위해 onNewIntent() 메서드를 사용한다
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (NfcAdapter.ACTION_TAG_DISCOVERED == intent.action) {
// NFC 태그를 감지하면 호출됩니다.
val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return
// 태그에 데이터를 쓰는 작업을 수행합니다.
writeTag(tag)
}
}
이제 NFC 태그에 데이터를 쓰는 함수를 작성해야한다.
다음 코드는 NFC 태그에 텍스트 데이터를 쓰는 방법을 보여준다.
private fun writeTag(tag: Tag) {
val data = "Hello, World!" // 쓸 데이터
val ndefRecord = NdefRecord.createTextRecord(null, data)
val ndefMessage = NdefMessage(arrayOf(ndefRecord))
// NFC 태그에 쓰기 작업을 수행합니다.
val ndef = Ndef.get(tag) ?: return
ndef.connect()
ndef.writeNdefMessage(ndefMessage)
ndef.close()
}
위 코드에서는 NdefRecord.createTextRecord() 메서드를 사용하여 NDEF 레코드를 생성하고, NdefMessage() 객체의 배열에 저장하여 NDEF 메시지를 만든다.
그 다음 Ndef.get() 메서드를 사용하여 NFC 태그를 가져온 후 connect() 메서드로 연결한다.
마지막으로 writeNdefMessage() 메서드를 사용하여 NDEF 메시지를 NFC 태그에 쓴다.
NFC 태그에서 데이터를 읽으려면 NfcAdapter 클래스의 enableForegroundDispatch() 메서드를 사용하여 NFC 태그를 감지하도록 애플리케이션을 설정해야한다
enableForegroundDispatch() 메서드를 사용하여 NFC 태그를 감지하도록 애플리케이션을 설정한다.
다음 코드는 onResume() 메서드에서 enableForegroundDispatch() 메서드를 호출하여 NFC 태그를 감지하도록 설정한다
override fun onResume() {
super.onResume()
val intent = Intent(this, this.javaClass)
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING)
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
val filter = IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED)
val filters = arrayOf(filter)
val techList = arrayOf(arrayOf(NfcA::class.java.name))
val adapter = NfcAdapter.getDefaultAdapter(this)
adapter.enableForegroundDispatch(this, pendingIntent, filters, techList)
}
위 코드에서는 IntentFilter 클래스를 사용하여 NfcAdapter.ACTION_TAG_DISCOVERED 인텐트 필터를 생성한다.
그리고 enableForegroundDispatch() 메서드를 호출하여 NFC 태그를 감지하도록 설정하고 있다.
이 메서드에 전달하는 인자는 다음과 같다.
- activity: 이 액티비티
- pendingIntent: NFC 태그를 감지하면 호출될 PendingIntent
- intentFilters: NFC 태그에서 감지할 인텐트 필터
- techLists: NFC 태그에서 감지할 기술 리스트
onPause() 메서드에서는 disableForegroundDispatch() 메서드를 호출하여 NFC 태그 감지를 중지한다
override fun onPause() {
super.onPause()
val adapter = NfcAdapter.getDefaultAdapter(this)
adapter.disableForegroundDispatch(this)
}
이제 onNewIntent() 메서드에서 NFC 태그에서 데이터를 읽는 코드를 작성할 수 있다.
다음 코드는 NFC 태그에서 텍스트 데이터를 읽는 방법을 보여준다.
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (NfcAdapter.ACTION_TAG_DISCOVERED == intent.action) {
// NFC 태그를 감지하면 호출됩니다.
val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG) ?: return
// 태그에서 데이터를 읽는 작업을 수행합니다.
readTag(tag)
}
}
private fun readTag(tag: Tag) {
val ndef = Ndef.get(tag) ?: return
ndef.connect()
val ndefMessage = ndef.ndefMessage ?: return
val message = ndefMessage.records.firstOrNull()?.payload ?: return
val data = String(message)
// 태그에서 읽어온 데이터를 사용합니다.
// ...
ndef.close()
}
위 코드에서는 Ndef.get() 메서드를 사용하여 NFC 태그를 가져온 후 connect() 메서드로 연결한다.
그런 다음 ndef.ndefMessage 속성을 사용하여 NDEF 메시지를 가져온 후, 첫 번째 레코드의 페이로드를 가져와서 텍스트 데이터를 읽는다. 마지막으로 close 메서드를 사용하여 연결을 종료한다
위의 코드에서는 try-catch-finally 블록을 사용하여 예외 처리를 하고 있다.
NFC 태그를 읽는 과정에서 예외가 발생할 수 있기 때문에 try 블록 안에서 해당 코드를 실행하고, 예외가 발생하면 catch 블록에서 처리해준다.
finally 블록에서는 ndef.close() 메서드를 호출하여 연결을 종료한다.
이렇게 하면 NFC 태그를 사용한 작업이 끝나면 항상 연결이 종료되도록 보장할 수 있다.
'안드로이드 > KOTLIN' 카테고리의 다른 글
[code] 코드로 앱 깨끗하게 종료시키기 (0) | 2021.01.20 |
---|