Android 13下NFC触发SecurityException权限拒绝问题求助
Android 13 NFC
SecurityException 修复方案(目标版本≤13) 问题根源
Android 13的NFC框架存在原生bug,当尝试关闭已过期的Tag对象时,会触发java.lang.SecurityException: Permission Denial: Tag is out of date异常,进而导致isodep.close()调用崩溃,该问题已在Android 14中被官方修复。
可行解决方案
方案1:捕获异常并安全处理
在调用isodep.close()的代码块中针对性捕获异常,避免崩溃扩散,同时提前校验Tag连接状态:
if (isodep != null && isodep.isConnected()) { try { // 执行你的NFC核心操作逻辑 } catch (Exception e) { // 处理NFC操作中的常规异常 } finally { try { isodep.close(); } catch (IOException e) { Log.d("NFC", "关闭ISO-Dep连接失败", e); } catch (SecurityException e) { // 专门拦截Android 13的Tag过期异常 Log.d("NFC", "Android 13 Tag已过期,跳过关闭操作", e); } } }
方案2:避免复用Tag对象
Android 13中Tag对象的有效期极短,禁止缓存旧Tag实例复用,每次NFC交互都从最新的Intent中获取Tag:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { IsoDep isodep = IsoDep.get(tag); if (isodep != null) { try { isodep.connect(); // 执行单次NFC操作 } catch (Exception e) { // 处理连接或操作异常 } } }
方案3:提前校验Tag有效性
在执行NFC操作前,通过尝试连接来判断Tag是否仍有效,无效则直接放弃操作:
if (isodep != null) { try { if (!isodep.isConnected()) { isodep.connect(); } // 执行操作 } catch (SecurityException e) { // Tag已过期,终止当前流程 return; } catch (IOException e) { // 处理连接异常 } }
额外注意事项
- 确保应用已正确声明NFC权限:
android.permission.NFC,Android 12及以上版本无需额外权限(前台使用NFC场景除外)。 - 尽量缩短NFC操作的耗时,降低Tag对象在操作过程中过期的概率。
内容的提问来源于stack exchange,提问作者Anh Luu
相关产品推荐
相关产品推荐

