在Android 13上执行ndef.connect()时出现安全异常

utugiqy6  于 2023-03-16  发布在  Android
关注(0)|答案(2)|浏览(298)

我有这个代码(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写入来解决此问题。
谢谢大家的帮助。

jjhzyzn0

jjhzyzn01#

这是设计的意图,这里的问题是您存储了一个标记句柄,并试图在以后使用它(甚至可能是在让用户按下一个按钮左右之后?)。你一开始就不应该这么做,NFC是一种用户交互,您应在扫描标签后立即采取行动,并尽可能缩短交易时间(毕竟用户并不擅长长时间地将两台设备放在一起)。Android终于减少了这方面的不良编程习惯(请参阅here),方法是在尝试访问标记时确保标记句柄是最新的。此更改可防止在标记断开连接或发现新标记时访问无效的标记句柄。

6ioyuze2

6ioyuze22#

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

相关问题