How to read the SD Card ID number?

后端 未结 12 2113
[愿得一人]
[愿得一人] 2020-12-05 08:15

How can I programatically read the SD Card\'s CID register, which contains a Serial Number and other information? Can I do it through Android Java, or Native code?

相关标签:
12条回答
  • 2020-12-05 08:32

    for mmcblk0, just write in shell as:

    cat /sys/block/mmcblk0/device/cid 
    2750485344303847307cf6851900b99b
    
    cat /sys/block/mmcblk0/device/serial 
    0x7cf68519
    

    you can implement it in java easily.

    ref:
    https://www.kernel.org/doc/Documentation/mmc/mmc-dev-attrs.txt
    https://www.kernel.org/doc/Documentation/sysfs-rules.txt
    http://www.cameramemoryspeed.com/sd-memory-card-faq/reading-sd-card-cid-serial-psn-internal-numbers/

    0 讨论(0)
  • 2020-12-05 08:33

    There is no Android API that can do this that I am aware of and for a general solution that is needed. To provide some background the SD card is connected to a hw-controller that is specific to the device platform. It is possible to read out the cid value from the linux /sys file system if you know your platform. The following snippet works on my droid (TI omap based platform) but not on Qualcomm MSM based platforms.

    try {
            BufferedReader input = new BufferedReader(new FileReader("/sys/devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:aaaa/cid"));
            String sd_cid = input.readLine();
            Log.i("CID_APP", sd_cid);
        } catch (Exception e) {
            Log.e("CID_APP","Can not read SD-card cid");
        }
    

    On a another platform the sys file we are looking for is different. It may even differ between different cards on the same platform since I was not able to test that. On MSM based devices the path would be something like /sys/devices/platform/msm_sdcc.1/mmc_host/...

    Since we have this hardware dependence on reading out the SD-card CID there would have to be an update to the Android API:s that provides general access. This API would then have to be implemented by each device manufacturer to map to the correct sd card controller driver.

    0 讨论(0)
  • 2020-12-05 08:34

    There is api in android for getting sd card serial id. The method is called getFatVolumeId(String mountPoint), where "mountPoint" is sd card name (you can get this name by calling Environment.getExternalStorageDirectory()). But getFatVolumeId is kindof hidden function (or forgotten), so you want to create package in your project named android.os and the class in it to reference the native method, to be able to call it:

    package android.os;
    
    public class FileUtils {
        public static native int getFatVolumeId(String mountPoint);
    }
    

    And the code is:

    File SdCard = Environment.getExternalStorageDirectory();
    int Serial = FileUtils.getFatVolumeId(SdCard.getName());
    

    Also see the links

    http://groups.google.com/group/android-framework/browse_thread/thread/1abd18435ba20a67?pli=1 http://markmail.org/message/rdl4bhwywywhhiau#query:+page:1+mid:rdl4bhwywywhhiau+state:results

    0 讨论(0)
  • 2020-12-05 08:35

    Even though the relatively ancient Palm OS and Windows Mobile OS devices are able to read the SD card ID, AFAIK Android devices aren't capable of doing that yet. This is particularly troubling given the problems with the Settings.Secure.ANDROID_ID discussed here.

    0 讨论(0)
  • 2020-12-05 08:44

    Here is sample code for getting SID and CID

    if (isExteranlStorageAvailable()) {
        try {
            File input = new File("/sys/class/mmc_host/mmc1");
            String cid_directory = null;
            int i = 0;
            File[] sid = input.listFiles();
    
            for (i = 0; i < sid.length; i++) {
                if (sid[i].toString().contains("mmc1:")) {
                    cid_directory = sid[i].toString();
                    String SID = (String) sid[i].toString().subSequence(
                            cid_directory.length() - 4,
                            cid_directory.length());
                    Log.d(TAG, " SID of MMC = " + SID);
                    break;
                }
            }
            BufferedReader CID = new BufferedReader(new FileReader(
                    cid_directory + "/cid"));
            String sd_cid = CID.readLine();
            Log.d(TAG, "CID of the MMC = " + sd_cid);
    
        } catch (Exception e) {
            Log.e("CID_APP", "Can not read SD-card cid");
        }
    
    } else {
        Toast.makeText(this, "External Storage Not available!!",
                Toast.LENGTH_SHORT).show();
    }
    
    0 讨论(0)
  • 2020-12-05 08:44

    Building on Dinesh's answer...

    Dinesh suggested looking in the directory /sys/class/mmc_host/mmc1/mmc1:*/ (where * is a number) for the file named cid, which gives us the contents of the card's CID register. This is does work in many cases, and is a very helpful start.

    But mmc1 is not always the removable SD card. Sometimes, e.g. on a Motorola Droid Pro with Android API level 10, mmc0 is the removable SD card, and mmc1 is something else. I'm guessing that mmc1, when present, points to internal storage of some sort (possibly a non-removable microSD card). On a cheap Android tablet we tested, mmc0 is the SD card and there is no mmc1.

    So you can't just assume that mmc1 is the SD card.

    A glimmer of hope: It seems (so far) that by looking at the type file in the same directory as the cid file (e.g. /sys/class/mmc_host/mmc1/mmc1:0007/type), we can determine which is which: a type value of SD indicates a removable SD card, while MMC is not.

    However, that's just from testing on a few Android devices. I can't find any specifications about the contents of the type file, so if somebody else knows of relevant documentation, please let me know.

    Of course, MMC and SD are just two different storage technology standards, and SD is backward-compatible with MMC. So it's not necessarily the case that type SD always corresponds to an external microSD card. It doesn't seem likely that MMC could indicate a microSD card at all (if the type field is populated accurately); but on the other hand, it's conceivable that a non-removable SD card could have type SD.

    For further research: Does this approach work when an microSD card is connected via a USB adapter? My one test on this, with a tablet, had the USB-connected microSD card show up as mmc1, with type SD.

    0 讨论(0)
提交回复
热议问题