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

如何在Android Nougat版本中通过代码获取SD卡CID编号?

问题分析与解决方案

你遇到的问题核心是Android Nougat(7.0)引入的系统权限与文件访问限制,导致之前直接读取/sys/目录下sysfs文件的方法失效了。

为什么在Nougat中会返回null?

从Android 7.0开始,系统对应用的文件访问权限做了大幅收紧:

  • /sys/class/mmc_host/、/sys/block/这类路径属于内核暴露的系统敏感目录,普通第三方应用即使申请了READ_EXTERNAL_STORAGE权限,也无法通过SELinux的访问规则,直接读取这些目录会返回null或者抛出权限异常。
  • 你的代码中,input.listFiles()在访问/sys/class/mmc_host/mmc1时会返回null,导致后续的cidDirectory变量无法赋值,最终触发FileNotFoundException;第二个方法中读取/sys/block/mmcblk1/device/cid的操作也会因为权限被拒绝而失败。

可行的解决方案

根据你的应用类型,有两种不同的处理方向:

1. 如果你是第三方普通应用

很遗憾,Android 7.0及以上的公开API并没有提供获取SD卡CID、序列号这类硬件敏感信息的接口,系统出于隐私和安全考虑,禁止普通应用访问这类数据。你需要调整功能逻辑,避免依赖这些信息。

2. 如果你是系统应用(拥有系统签名权限)

如果你的应用属于系统预装应用,可以通过以下方式适配:

  • 在AndroidManifest.xml中添加系统级权限:
    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
    
  • 确保应用使用系统签名进行打包,这样才能绕过SELinux的访问限制,继续使用你之前的代码逻辑读取sysfs文件。

额外注意事项

不同设备的MMC节点命名可能存在差异(比如有的设备SD卡对应mmc0而非mmc1),即使是系统应用,也建议先遍历/sys/class/mmc_host/下的所有子目录,再匹配包含SD卡标识的节点,避免硬编码路径导致适配问题。

内容的提问来源于stack exchange,提问作者Surendra Naidu Karna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:52:47