Android 13中NFC写入时ndef.connect()触发SecurityException的问题及解决
Android 13 NFC写入抛出SecurityException问题解决
问题场景
我有一段用于写入NFC标签的Java代码,在适配Android最新版本前可正常工作,但在Android 13上运行时抛出权限拒绝异常,提示Tag过期。
原代码
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(); }
抛出的异常
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)
问题原因及解决方案
Android 13对NFC操作的安全校验逻辑做了更新:onNewIntent中获取的Tag对象存在时效性限制,直接在此生命周期内触发写入操作,系统会判定Tag对象已过期,从而抛出权限拒绝异常。
解决方法是将NFC写入操作的触发逻辑从onNewIntent迁移至onResume方法中,确保在Tag对象处于有效状态时执行写入流程,即可解决该异常。
内容的提问来源于stack exchange,提问作者autoimovil
相关产品推荐
相关产品推荐

