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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:37