모바일 애플리케이션 환경에서 근거리 무선 통신(NFC) 기술은 단순한 데이터 전송을 넘어 도어락 제어, 스마트 결제, 태그 기반의 정보 수집 등 다양한 영역에서 핵심적인 역할을 수행합니다. 하지만 Android NFC API를 처음 접하는 개발자들은 태그 인식 실패나 복잡한 프로토콜 처리로 인해 구현에 어려움을 겪는 경우가 많습니다. 효율적인 NFC 연동 기능을 구현하기 위해 반드시 확인해야 할 설정값과 실무적인 팁을 정리합니다.
1. 매니페스트 구성 및 권한 설정
NFC 기능을 사용하기 위해서는 가장 먼저 AndroidManifest.xml에 필요한 권한과 하드웨어 기능을 정의해야 합니다. 디바이스의 NFC 지원 여부에 따라 앱 설치 가능 여부를 결정하므로 신중한 설정이 필요합니다.
<!-- NFC 권한 선언 -->
<uses-permission android:name="android.permission.NFC" />
<!-- 하드웨어 필수 여부 설정 -->
<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
만약 NFC가 없는 기기에서도 앱이 동작해야 한다면 android:required 값을 false로 지정하고, 런타임 시점에서 NfcAdapter를 통해 가용성을 체크하는 로직을 추가해야 합니다.
2. 인텐트 필터(Intent Filter) 최적화
NFC 태그가 감지되었을 때 시스템이 적절한 Activity를 호출할 수 있도록 인텐트 필터를 구성해야 합니다. Android는 NDEF 데이터 존재 여부나 태그 기술 유형에 따라 세 가지 우선순위(NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED)로 인텐트를 분류합니다.
<activity android:name=".NfcScanningActivity"
android:launchMode="singleTop">
<!-- 1순위: NDEF 데이터 필터링 -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<!-- 2순위: 특정 기술 유형 필터링 -->
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_list" />
<!-- 3순위: 일반 태그 감지 -->
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
여기서 android:launchMode="singleTop" 설정은 매우 중요합니다. 태그를 인식할 때마다 새로운 Activity 인스턴스가 생성되는 것을 방지하고, onNewIntent()를 통해 기존 인스턴스에서 데이터를 처리할 수 있게 해줍니다.
3. 기술 리스트(Tech-List) 파일 작성
특정 칩셋이나 프로토콜을 사용하는 태그만 필터링하려면 별도의 XML 파일을 작성해야 합니다. res/xml/nfc_tech_list.xml 파일을 생성하고 지원할 기술 스택을 정의합니다.
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- MifareClassic 태그 지원 -->
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.MifareClassic</tech>
</tech-list>
<!-- NDEF 포맷 태그 지원 -->
<tech-list>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
기술 리스트를 여러 개 정의하면 OR 연산으로 작동하여, 나열된 조건 중 하나라도 일치하는 태그를 모두 인식할 수 있습니다.
4. 포그라운드 디스패치(Foreground Dispatch) 활용
앱이 이미 실행 중인 상태에서 다른 앱이 NFC 인텐트를 가로채지 못하게 하려면 Foreground Dispatch 시스템을 사용해야 합니다. onResume()에서 활성화하고 onPause()에서 비활성화하여 리소스를 관리합니다.
private void enableNfcSystem(Activity activity, NfcAdapter adapter) {
Intent intent = new Intent(activity, activity.getClass())
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(
activity, 0, intent, PendingIntent.FLAG_MUTABLE);
adapter.enableForegroundDispatch(activity, pendingIntent, null, null);
}
이 방식을 사용하면 사용자가 앱을 사용 중일 때 태그를 접촉하면, 시스템 팝업 없이 즉시 현재 화면에서 데이터를 처리할 수 있어 향상된 사용자 경험을 제공합니다.