Android 13 上的 ndef.connect() 时出现 SecurityException

问题描述 投票:0回答:2

我有这个代码(Java)来写nfc标签:

private Tag tag;

@Override
protected void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    }
}

private boolean write(String message, Tag tag) throws IOException, FormatException {
    Ndef ndef = Ndef.get(tag);
    ndef.connect();
    if (ndef.isWritable()) {
        ndef.writeNdefMessage(message);
    }
    ndef.close();
}

在我更新我的应用程序以与最新版本的 Android 兼容之前,上述代码一直有效。

现在在 Android 13 上运行这段代码会出现以下异常:

java.lang.SecurityException: Permission Denial: Tag ( ID: XX XX XX XX XX XX XX ) is out of date
    at android.nfc.Tag.getTagService(Tag.java:388)
    at android.nfc.tech.BasicTagTechnology.connect(BasicTagTechnology.java:73)
    at android.nfc.tech.Ndef.connect(Ndef.java:71)

我知道存在一些兼容性问题,但我不知道具体是什么。

我感谢任何形式的帮助。

更新:感谢您的反馈和一些额外的研究,我找到了解决方案。

我从 onNewIntent 函数触发了这个 NFC 写入。由于某些安全问题,它似乎不再可能。我通过从 onResume 函数触发这个 NFC 写入来解决它。

谢谢大家的帮助。

java android nfc
2个回答
2
投票

这是设计使然。这里的问题是您存储了一个标记句柄并稍后尝试使用它(甚至可能在让用户按下按钮之后?)。你一开始就不应该这样做,NFC 是用户交互,你应该在扫描标签后立即采取行动并尽可能缩短交易时间(毕竟用户不擅长将两个设备长时间保持在一起) . Android 通过在您尝试访问标签时确保您的标签句柄是最新的,最终减少了这方面不良编程习惯的表面(参见 here)。一旦发生标签断开连接或新标签发现,此更改将阻止访问无效标签句柄。


0
投票

在 Android 13 上,一旦 onResume() 被调用,您似乎应该管理 NFC 写入。我解决了将 NFC 写入从 onNewIntent() 移动到 onResume() 的问题。

© www.soinside.com 2019 - 2024. All rights reserved.