2

我在我的应用程序中使用 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 意图并为我提供意图选择器。以下是清单文件中的代码。

<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 意图的应用程序。

我不确定我是否必须在清单文件或代码中做一些特定的事情。任何帮助表示赞赏。

4

2 回答 2

8

您获得意图选择器的原因是为数据类型注册了多个活动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
    
于 2015-01-30T05:25:22.790 回答
1

将外部类型 NDEF 记录与您自己的域一起使用,并为您的应用程序提供相应的意图过滤器。

于 2015-01-07T13:00:22.980 回答