Как прочитать идентификационный номер SD-карты?

Как я могу программно считывать регистр CID SD Card, который содержит серийный номер и другую информацию? Могу ли я сделать это через Android Java или собственный код?

Спасибо заранее, Эрик

Ответ 1

Вот пример кода для получения SID и 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();
}

Ответ 2

Мне удалось найти свой SD-карту CID, подключив мой телефон к компьютеру через usb и используя инструмент adb (Android SDK)

$ adb shell
# cat /sys/block/mmcblk0/../../cid

Мой телефон укоренен, поэтому я не уверен, что это доступно на ненарушенных телефонах.

Также попробуйте

$ adb shell
# cd /sys/block/mmcblk0/../../
# ls
block                 fwrev                 preferred_erase_size
cid                   hwrev                 scr
csd                   manfid                serial
date                  name                  subsystem
driver                oemid                 type
erase_size            power                 uevent

Это объясняется в документации ядра http://www.mjmwired.net/kernel/Documentation/mmc/mmc-dev-attrs.txt

Ответ 3

Единственный код, который я нашел до сих пор для предоставления идентификатора, - это С++ или С# http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-secure-digital-sd-card-serial.html

http://jo0ls-dotnet-stuff.blogspot.com/2008/12/read-cid-and-csd-c-implementation.html

Если вы разработчик С++, вы можете принять это и заставить его работать на Android.

Ответ 4

Как писал BMB, вы не можете узнать реальный путь к SD-карте в файловой системе /sys. Тем не менее, /sys реализует также псевдонимы, и вы можете получить CID через /sys/block/mmcblk 0/device/cid.

Например, на Tattoo running 2.2,/sys/block/mmcblk0 - это софт-ссылка (автоматически установленная системой) в/sys/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk0.

Ответ 5

Существует ави в android для получения серийного идентификатора sd card. Этот метод называется getFatVolumeId (String mountPoint), где "mountPoint" является именем sd-карты (вы можете получить это имя, вызывая Environment.getExternalStorageDirectory()). Но getFatVolumeId является скрытой функцией (или забытой), поэтому вы хотите создать пакет в своем проекте с именем android.os и класс в нем для ссылки на собственный метод, чтобы иметь возможность его называть:

package android.os;

public class FileUtils {
    public static native int getFatVolumeId(String mountPoint);
}

И код:

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

Также см. ссылки

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

Ответ 6

Я сделал это... это сработало для меня... надеюсь, что это ясно и ясно!

String getSDCARDiD()
    {
        try {

            File file = new File("/sys/block/mmcblk1");
            if (file.exists() && file.isDirectory()) {

                memBlk = "mmcblk1";
            } else {
                //System.out.println("not a directory");
                memBlk = "mmcblk0";
            }

            Process cmd = Runtime.getRuntime().exec("cat /sys/block/"+memBlk+"/device/cid");
            BufferedReader br = new BufferedReader(new InputStreamReader(cmd.getInputStream()));
            sd_cid = br.readLine();
            //System.out.println(sd_cid);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sd_cid;
    }

Ответ 7

Нет Android API, который может сделать это, что я знаю, и для общего решения, которое необходимо. Чтобы обеспечить некоторый фон, SD-карта подключена к hw-контроллеру, который относится к платформе устройства. Можно узнать значение cid из файловой системы linux/sys, если вы знаете свою платформу. Следующий снипп работает на моем дроиде (платформа TI omap), но не на платформах на базе Qualcomm MSM.

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");
    }

На другой платформе файл sys, который мы ищем, отличается. Он может даже отличаться между разными картами на той же платформе, поскольку я не смог проверить это. На устройствах на базе MSM путь будет выглядеть как /sys/devices/platform/msm _sdcc.1/mmc_host/...

Поскольку у нас есть эта аппаратная зависимость от считывания CID SD-карты, должно появиться обновление для Android API: s, обеспечивающий общий доступ. Этот API затем должен быть реализован каждым производителем устройства для сопоставления с правильным драйвером контроллера SD-карты.

Ответ 8

Я тоже искал эту функцию, но никогда не мог получить домашнее решение. Я закончил поиск компании, которая делает читателя SID. Перейдите на страницу nexcopy.com и просмотрите раздел дубликатов SD или microSD. Он может считывать до 20 карт за раз.

Ответ 9

Несмотря на то, что относительно старые устройства Palm OS и Windows Mobile могут считывать идентификатор SD-карты, устройства Android AFAIK пока не способны. Это особенно тревожно, учитывая проблемы с параметрами Settings.Secure.ANDROID_ID, обсуждаемые здесь здесь.

Ответ 11

На основе ответа Динеша...

Динеш предложил посмотреть в каталоге /sys/class/mmc_host/mmc1/mmc1:*/ (где * - число) для файла с именем cid, который дает нам содержимое регистра CID карты. Это во многих случаях работает, и это очень полезно.

Но mmc1 не всегда является съемной SD-картой. Иногда, например, на Motorola Droid Pro с уровнем API Android 10, mmc0 - съемная SD-карта, а mmc1 - это что-то еще. Я предполагаю, что mmc1, если присутствует, указывает на внутреннее хранилище какого-либо типа (возможно, несъемную карту microSD). На дешевом Android-планшете, который мы тестировали, mmc0 - это SD-карта, и нет mmc1.

Поэтому вы не можете просто предположить, что mmc1 - это SD-карта.

Мечта надежды: Кажется (пока), что, смотря на файл type в том же каталоге, что и файл cid (например, /sys/class/mmc_host/mmc1/mmc1:0007/type), мы можем определить, что такое: значение типа из SD указывает съемную SD-карту, а MMC - нет.

Однако, это просто от тестирования на нескольких устройствах Android. Я не могу найти никаких спецификаций о содержимом файла type, поэтому, если кто-то еще знает соответствующую документацию, сообщите мне.

Конечно, MMC и SD - это всего лишь два разных стандарта технологии хранения, а SD обратно совместим с MMC. Поэтому не обязательно, чтобы тип SD всегда соответствовал внешней карте microSD. Не похоже, что MMC может указывать на карту microSD вообще (если поле типа заполнено точно); но, с другой стороны, возможно, что несъемная SD-карта может иметь тип SD.

Для дальнейшего исследования: работает ли этот подход при подключении карты microSD через USB-адаптер? Мой единственный тест на этом, с планшетом, имел USB-подключенную карту microSD, отображаемую как mmc1, с типом SD.