Как прочитать идентификационный номер SD-карты? - PullRequest
16 голосов
/ 28 июля 2010

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

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

Ответы [ 11 ]

13 голосов
/ 04 марта 2011

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

Мне удалось найти CID моей SD-карты, подключив телефон к компьютеру через 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

5 голосов
/ 16 мая 2012

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

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;
    }
4 голосов
/ 20 февраля 2012

В Android есть API для получения серийного идентификатора SD-карты. Метод называется 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

4 голосов
/ 16 сентября 2010

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

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

4 голосов
/ 06 сентября 2010

Единственный код, который я нашел для предоставления идентификатора, это C ++ или C # http://jo0ls -dotnet-stuff.blogspot.com / 2008/12 / чтение безопасной-цифровая SD-карта serial.html
http://jo0ls -dotnet-stuff.blogspot.com / 2008/12 / чтения чид-и-CSD-с-implementation.html
Если вы разработчик C ++, вы можете взять это и заставить работать на Android.

3 голосов
/ 14 сентября 2010

Нет 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-карты, должно быть обновление API Android, обеспечивающее общий доступ. Затем этот API должен быть реализован каждым производителем устройства для сопоставления с правильным драйвером контроллера SD-карты.

2 голосов
/ 30 августа 2016

для mmcblk0, просто напишите в оболочке как:

cat /sys/block/mmcblk0/device/cid 
2750485344303847307cf6851900b99b

cat /sys/block/mmcblk0/device/serial 
0x7cf68519

Вы можете легко реализовать его в Java.

ссылка:
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/

2 голосов
/ 14 июня 2012

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

1 голос
/ 16 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...