我在我的应用程序中使用NFC,它运行正常。但是我想确保只启动我的应用程序,并且没有其他应用程序可以处理意图。以下是我的清单文件中的代码:
<activity android:name="com.mypackage.name.BeamActivity">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
我的手机上有另一个示例应用程序,它正在检测NFC Intent并为我提供Intent Chooser。以下是Manifest文件中的代码。
<activity android:name="com.package2.name.NFCStickyNotesActivity" android:label="Sticky Notes" >
<!-- Handle notes detected from outside our application -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
当我的应用程序从另一台设备推送时,我希望我的应用程序成为处理特定NFC Intent的唯一应用程序。
我不确定是否必须在清单文件或代码中执行某些特定操作。任何帮助表示赞赏。
答案 0 :(得分:5)
您获得意向选择器的原因是为数据类型text/plain
注册了多个活动。这是一个相当常见的情况,因此您应该避免对应该启动您的活动的NDEF记录使用此类通用数据类型。您有两种方法可以解决此问题:
为您的NDEF记录使用NFC论坛外部类型(这是ThomasRS已经提到的内容)。使用此方法,您可以创建仅对您的应用程序有意义的自定义记录类型。您可以创建这样的记录(将其写入您的标签或通过Beam发送),如下所示:
NdefRecord extRecord = NdefRecord.createExternal(
"yourdomain.com", // your domain name
"yourtype", // your type name
textBytes); // payload
然后,您可以注册您的活动以在此记录上启动,如下所示:
<activity ...>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc" android:host="ext"
android:pathPrefix="/yourdomain.com:yourtype" />
</intent-filter>
</activity>
使用Android应用程序记录(AAR)。 AAR将确保NDEF_DISCOVERED
意图仅传递给具有特定包名称的应用程序。您可以创建这样的记录(将其写入您的标签或通过Beam发送),如下所示:
NdefRecord appRecord = NdefRecord.createApplicationRecord(
"com.yourdomain.yourapp");
NdefRecord textRecord = NdefRecord.createTextRecord(
"en", // language code
"yourtext" // human-readable text);
NdefMessage msg = new NdefMessage(
textRecord,
appRecord); // use the AAR as the *last* record in your NDEF message
答案 1 :(得分:1)
将外部类型NDEF记录与您自己的域一起使用,并为您的应用提供相应的意图过滤器。