发现NFC时启动特定应用

pro*_*boy 2 android nfc intentfilter android-beam ndef

我在我的应用程序中使用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>
Run Code Online (Sandbox Code Playgroud)

我的手机上还有另一个示例应用程序,该应用程序正在检测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>
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序成为将特定NFC Intent从另一台设备推送过来时唯一的应用程序。

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

Mic*_*and 6

之所以获得意图选择器,是因为该数据类型注册了多个活动text/plain。这是一种很常见的情况,因此您应避免将此类通用数据类型用于应启动您的活动的NDEF记录。您有两种选择可以解决此问题:

  1. 对您的NDEF记录使用NFC论坛外部类型(这是ThomasRS已经提到的内容)。使用这种方法,您可以创建仅对您的应用有意义的自定义记录类型。您可以使用以下内容创建此类记录(将其写入标签或通过Beam发送):

    NdefRecord extRecord = NdefRecord.createExternal(
            "yourdomain.com",  // your domain name
            "yourtype",        // your type name
            textBytes);        // payload
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以注册您的活动以启动此记录,如下所示:

    <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>
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)