You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:52:09