发现NFC时启动特定应用程序

时间:2014-12-30 20:30:33

标签: android nfc intentfilter ndef android-beam

我在我的应用程序中使用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的唯一应用程序。

我不确定是否必须在清单文件或代码中执行某些特定操作。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:5)

您获得意向选择器的原因是为数据类型text/plain注册了多个活动。这是一个相当常见的情况,因此您应该避免对应该启动您的活动的NDEF记录使用此类通用数据类型。您有两种方法可以解决此问题:

  1. 为您的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>
    
  2. 使用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记录与您自己的域一起使用,并为您的应用提供相应的意图过滤器。