Android平台下如何以编程方式获取SD卡的CID编号?
获取Android设备SD卡CID编号的可靠实现
我看到你尝试通过读取sys文件系统的方式获取SD卡CID,这个思路方向是对的,但现有代码存在几个影响兼容性和完整性的问题,比如硬编码路径、只截取了部分字符等。下面给你整理一个更通用、完整的实现方案:
现有代码的问题分析
- 硬编码的
/sys/class/mmc_host/mmc1路径不适配所有设备:有些设备的外置SD卡可能对应mmc0或其他编号的host节点 - 仅截取了目录名称的最后4位,没有真正读取CID文件的完整内容
- 缺少对文件存在性、可读性的判断,异常处理也不完整
完整实现代码
import android.util.Log; import java.io.File; import java.io.IOException; import java.nio.file.Files; public String getSDCardCID() { // 遍历所有mmc_host目录,适配不同设备的SD卡节点编号 File mmcHostRoot = new File("/sys/class/mmc_host/"); File[] hostDirectories = mmcHostRoot.listFiles(); if (hostDirectories == null) { Log.w("MainActivity", "No mmc_host directories found"); return null; } for (File hostDir : hostDirectories) { File[] mmcDeviceDirs = hostDir.listFiles(); if (mmcDeviceDirs == null) continue; // 寻找带":"的设备节点(格式通常为mmcX:XXXX) for (File deviceDir : mmcDeviceDirs) { if (deviceDir.getName().contains(":")) { File cidFile = new File(deviceDir, "cid"); if (cidFile.exists() && cidFile.canRead()) { try { // 读取CID文件内容,去除多余换行符 String cidHex = new String(Files.readAllBytes(cidFile.toPath())).trim(); Log.d("MainActivity", "Successfully retrieved SD Card CID: " + cidHex); return cidHex; } catch (IOException e) { Log.e("MainActivity", "Failed to read CID file", e); } } } } } Log.w("MainActivity", "SD Card CID not found or inaccessible"); return null; }
关键注意事项
- 兼容性适配:通过遍历所有
mmc_host子目录,避免了硬编码路径的问题,能适配大多数Android设备 - 权限说明:读取
/sys目录下的这类系统文件,一般不需要申请危险权限。但如果你的应用目标SDK版本≥30,针对Android 10及以上设备,建议在AndroidManifest.xml中添加android:requestLegacyExternalStorage="true"来规避文件访问限制 - 空值判断:如果设备没有外置SD卡、SD卡未挂载,或者ROM隐藏了CID节点,方法会返回
null,调用时记得做非空判断 - CID格式:读取到的内容是16字节的十六进制字符串,这是SD卡的全球唯一标识,你可以根据需求进行格式化或解析
测试建议
建议在不同品牌的设备(如三星、小米、华为等)上测试验证,部分深度定制的ROM可能会限制对/sys目录的访问,这种情况下该方法可能无法生效。
内容的提问来源于stack exchange,提问作者madhuri H R
相关产品推荐
相关产品推荐

