使用 NFC 打开我的应用程序会导致打开它的一个单独版本,而不是在发现 RFID 时打开的版本

Using NFC to open my application causes a separate version of it to be opened instead of the one that was open when RFID was found

我正在尝试创建一个以 NFC 为中心并与多个 RFID 配对的应用程序。出于这个原因,我正在使用 NDefRecords 对 RFID 进行编程,在我的应用程序中打开特定的 activity。这样做的NdefMessage如下

NdefRecord mimeRecord =
NdefRecord.createMime("application/com.example.rfidprogrammer.testactivity","Some text".getBytes(StandardCharsets.US_ASCII));
NdefMessage ndefMessage = new NdefMessage(new NdefRecord[] { mimeRecord});

我正在打开的 activity 的清单使用以下意图过滤器:

<activity 
android:name=".TestClass"
android:exported="true">
   <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <category android:name="android.intent.category.DEFAULT"/>
      <data android:mimeType = 
         "application/com.example.rfidprogrammer.testactivity"/>
   </intent-filter>
</activity>

写入我正在使用的 RFID 的代码如下所示:

private String writeTagData(Tag tag) {
        StringBuilder sb = new StringBuilder();
        //get takes given tag and creates a Ndef based on information
        Ndef ndef = Ndef.get(tag);
        if(ndef != null){
            try {
                ndef.connect();
                ndef.writeNdefMessage(ndefMessage);
                ndef.close();
            } catch (IOException | FormatException e) {
                e.printStackTrace();
            }
        }else{
            //if the Ndef failed NdefFormatable will attempt, if this fails the rfid device is not
            //  recognized by this device
            NdefFormatable formatable = NdefFormatable.get(tag);
            try {
                formatable.connect();
                formatable.format(ndefMessage);
                formatable.close();
            } catch (IOException | FormatException e) {
                e.printStackTrace();
            }
        }
        byte[] id = tag.getId();
        sb.append("\tID (hex): ").append(toHex(id)).append('\n');
        sb.append("\tID (reversed hex): ").append(toReversedHex(id)).append('\n');
        sb.append("\tID (dec): ").append(toDec(id)).append('\n');
        sb.append("\tID (reversed dec): ").append(toReversedDec(id)).append('\n');
        Log.v("Write MODE\n",sb.toString());
    return sb.toString();
    }

我成功地将其写入标签,因为当我尝试扫描 RFID 时,我被带到了正确的 activity 但是如果我的应用程序已经打开,我的应用程序的不同版本具有不同的徽标显示在最近的应用程序部分。有没有办法让我在当前运行的应用程序版本中使用Mimetypes、NdefRecords和NFC打开想要的activity?是否可以在不 account/process 意图在您的应用程序中打开特定 activity 的情况下完成此操作?

您似乎没有进行任何前台检测,真正的清单条目仅用于通过 NFC 启动您的应用程序(如果尚未启动)运行。

如果您的应用程序是 运行,您应该使用 2 个前景检测 API 之一,旧的不太可靠 enableForegroundDispatch 或更新更好的 enableReaderMode

是如何更好地使用 enableReaderMode

的示例

您可以将这两者与 Manifest 过滤器结合使用,以在您的应用程序存在和不存在时处理 NFC 运行 当 NFC 标签出现时。

另请注意,您的 Manifest 过滤器不会针对您的 write 方法的 NdefFormatable 触发,您的 Manifest 过滤器需要针对 ACTION_TECH_DISCOVEREDandroid.nfc.tech.NdefFormatable 进行过滤。详情见Here