如何在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
相关产品推荐
相关产品推荐

