我正在尝试编写一个简单的应用程序来与NFC标签进行交互,但我似乎无法让手机做任何事情,只能触发默认的NFC标签应用程序。我真的只是希望能够拦截我扫描的任何标签,确定它是否有一些数据,并采取相应的行动。
现在我的清单文件看起来像
<uses-sdk android:minSdkVersion="10" />
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
<uses-permission android:name="android.permission.NFC"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".NfcActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
</intent-filter>
</activity>
</application>
然而,当扫描NFC标签时,我从未看到活动开始。我在这里错过了什么吗?我尝试将意图过滤器放在BroadcastReceiver
内并且没有运气......
答案 0 :(得分:23)
您无法通过扫描的所有NFC标签启动应用。 Android将根据intent过滤器的具体方式确定最合适的应用程序。但是,如果您的应用在前台运行,则可以使用NFC foreground dispatch来捕获所有NFC意图。
在onCreate()
添加:
mAdapter = NfcAdapter.getDefaultAdapter(this);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
在onResume()
添加:
mAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
在onPause()
添加:
mAdapter.disableForegroundDispatch(this);
在onNewIntent
中,你可以像这样获得NFC标签:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
答案 1 :(得分:7)
SDK文档将此作为一个基本示例。
<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 :(得分:1)
您期望标签以NDEF格式定义。因此,只有在读取的标签是NDEF格式时才会启动您的程序。
您可以尝试更多通用的意图过滤器,例如TAG_DISCOVERED或TECH_DISCOVERED。
答案 3 :(得分:0)
Android自动选择最相关的应用程序来处理扫描的NFC标签。您需要在intent-filter
中更加具体,即只收听TEXT标签,网址标签或CONTACT标签。这可以通过进一步指定过滤器来完成,例如,使用<data android:mimeType="text/plain" />
作为TEXT-Tags。否则,将触发默认的NFC-Tag应用程序。