Как я могу программно считывать регистр CID SD Card, который содержит серийный номер и другую информацию? Могу ли я сделать это через Android Java или собственный код?
Спасибо заранее, Эрик
Как я могу программно считывать регистр CID SD Card, который содержит серийный номер и другую информацию? Могу ли я сделать это через Android Java или собственный код?
Спасибо заранее, Эрик
Вот пример кода для получения 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();
}
Мне удалось найти свой 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
Единственный код, который я нашел до сих пор для предоставления идентификатора, - это С++ или С#
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.
Как писал 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.
Существует ави в 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
Я сделал это... это сработало для меня... надеюсь, что это ясно и ясно!
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;
}
Нет 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-карты.
Я тоже искал эту функцию, но никогда не мог получить домашнее решение. Я закончил поиск компании, которая делает читателя SID. Перейдите на страницу nexcopy.com и просмотрите раздел дубликатов SD или microSD. Он может считывать до 20 карт за раз.
Несмотря на то, что относительно старые устройства Palm OS и Windows Mobile могут считывать идентификатор SD-карты, устройства Android AFAIK пока не способны. Это особенно тревожно, учитывая проблемы с параметрами Settings.Secure.ANDROID_ID, обсуждаемые здесь здесь.
для mmcblk0
, просто напишите в shell как:
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/
На основе ответа Динеша...
Динеш предложил посмотреть в каталоге
/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
.