Jak mogę programowo odczytać rejestr CID karty SD, który zawiera numer seryjny i inne informacje? Czy mogę to zrobić poprzez Androida Java lub kod natywny?Jak odczytać numer identyfikacyjny karty SD?
Dzięki z góry, Eric
Jak mogę programowo odczytać rejestr CID karty SD, który zawiera numer seryjny i inne informacje? Czy mogę to zrobić poprzez Androida Java lub kod natywny?Jak odczytać numer identyfikacyjny karty SD?
Dzięki z góry, Eric
Chociaż stosunkowo starożytnych urządzenia Palm OS i Windows Mobile są w stanie odczytać identyfikator karty SD, urządzenia Android AFAIK nie są w stanie zrobić tego jeszcze. Jest to szczególnie niepokojące, biorąc pod uwagę problemy z Settings.Secure.ANDROID_ID omówione here.
Jedynym kod znalazłem dotąd zapewnić identyfikator jest C++ lub C# 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
Jeżeli jesteś C deweloper ++ może być w stanie wziąć to i sprawiają, że działa na Androidzie.
Brak Androida API, który może zrobić to, o czym wiem i dla ogólnego rozwiązania, które jest potrzebne. Aby zapewnić pewne tło, karta SD jest podłączona do kontrolera hw, który jest specyficzny dla platformy urządzenia. Możliwe jest odczytanie wartości cid z systemu plików linux/sys, jeśli znasz swoją platformę. Poniższy fragment działa na moim droidzie (platforma oparta na OMAP), ale nie na platformach opartych na 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");
}
Na innej platformie plik sys, którego szukamy, jest inny. Może się nawet różnić między różnymi kartami na tej samej platformie, ponieważ nie mogłem tego przetestować. Na urządzeniach opartych na MSM ścieżka będzie podobna do /sys/devices/platform/msm_sdcc.1/mmc_host/...
Ponieważ mamy tę zależność sprzętową od odczytywania identyfikatora CID karty SD, musielibyśmy aktualizacja do interfejsu API systemu Android: s zapewnia ogólny dostęp. Ten interfejs API musiałby zostać następnie zaimplementowany przez każdego producenta urządzenia w celu odwzorowania na właściwy sterownik karty SD.
Ścieżka różni się w zależności od urządzenia. –
Tak, dlatego powyższa odpowiedź Samuela Tardieu jest lepsza, choć nie idealna. – BMB
Jak napisał BMB, nie można poznać prawdziwej ścieżki karty SD w systemie plików/sys. Jednak/sys implementuje również aliasy, a ty możesz być w stanie pobrać CID przez/sys/block/mmcblk0/device/cid.
Na przykład na tatuażu z systemem 2.2,/sys/block/mmcblk0 jest miękkim łączem (ustalonym automatycznie przez system) na /sys/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:aaa/ block/mmcblk0.
Nie musi to być 'mmcblk0', ponieważ w niektórych urządzeniach może być więcej niż' mmcblk'. Jeśli szukasz konkretnego CID-a, powinieneś spróbować zajrzeć do 'mmcblk' * n *, a jeśli szukasz CID karty, w której znajduje się jakiś plik, powinieneś zanotować plik i uzyskać dostęp do urządzenia przez'/sys/dev/block/m: n/.. 'gdzie' m: n' to główny i mniejszy numer urządzenia, który otrzymałeś ze statystyki. Np. '/ sys/dev/block/179: 1/..'. '..' to przejście z partycji na kartę. –
@JanHudec: Czy można złożyć plik z poziomu aplikacji na system Android, aby uzyskać numery głównych/pomocniczych urządzeń? Nie widzę "stat()" ani niczego podobnego w interfejsach API Androida. – LarsH
@LarsH, prawdopodobnie nie. W każdym razie używam natywnego kodu, więc po prostu go tam nazywam. –
Oto przykładowy kod dla uzyskania SID i 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();
}
Dziękuję za dawanie dobrego przykładu do pobierania danych z dowolnego urządzenia bez żadnych innych ograniczeń ..... – Developer
Czy możesz wyjaśnić, co to robi? Czy '/ sys/class/mmc_host/mmc1' może polegać na różnych producentach? Co zrobi ten kod, jeśli jest więcej niż jedna karta microSD, np. jeden osadzony i jeden wymienny? – LarsH
wystarczy przeczytać kod, który można zrozumieć, co robi kod. nie możemy odpowiedzieć na to całkowicie, to było dla wersji Androida 2.x, ale to się nie zmieniło. więc zgodnie z tym musimy zmodyfikować kod. –
udało mi się znaleźć karty SD CID, podłączając telefon do komputera za pomocą kabla USB i za pomocą adb narzędzia (Android SDK)
$ adb shell
# cat /sys/block/mmcblk0/../../cid
Mój telefon jest zrootowany, więc nie jestem pewien, czy jest on dostępny na telefonach bez zrootowanych.
Sponsorowane
$ 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
one opisane w dokumentacji jądra http://www.mjmwired.net/kernel/Documentation/mmc/mmc-dev-attrs.txt
Próbowałem tego na nierootowanych telefonach (Huawei, Sony, Motorola) bez żadnych problemów. Powiedziałbym więc, że nie wymaga to zrootowanego telefonu. – LarsH
Istnieje api w android uzyskania karty SD identyfikatora seryjnego. Metoda nazywa się getFatVolumeId (String mountPoint), gdzie "mountPoint" to nazwa karty SD (tę nazwę można uzyskać, wywołując środowisko.getExternalStorageDirectory()). Ale getFatVolumeId jest kindof funkcję ukryty (lub zapomniane), więc chcesz, aby utworzyć pakiet w projekcie o nazwie android.os i klasy w niej odwoływać metody rodzimej, aby móc nazwać:
I kod jest:
File SdCard = Environment.getExternalStorageDirectory();
int Serial = FileUtils.getFatVolumeId(SdCard.getName());
zobacz także linki
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
Nie wygląda ani trafnie, ani użytecznie. Zwraca 32-bitową liczbę całkowitą, ale identyfikator CID jest dłuższy. Cztery razy. –
Chociaż nie daje CID, to jest użyteczne dla unikalnego identyfikowania obecnej "pamięci zewnętrznej". –
Nie odpowiada to na całe pytanie, ale * daje * numer seryjny karty, który jest odpowiedni i użyteczny. Przyszedłem tutaj myśląc, że potrzebuję CID i dowiedziałem się, że to, czego naprawdę szukałem, to numer seryjny, który jest tylko częścią CID i łatwiejszy do zdobycia. Dziękuję za tę odpowiedź. Właściwie 'Environment.getExternalStorageDirectory()' nie jest niezawodnym sposobem znalezienia ścieżki karty microSD, ale jest to problem uboczny. – LarsH
Zrobiłem ten ... zadziałało dla mnie ... mam nadzieję, że to jasne!
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;
}
Ja również szukałem tej funkcji, ale nigdy nie uda mi się uzyskać domowego rozwiązania warzonego. W końcu znalazłem firmę, która tworzy czytnik SID. Przejdź do strony nexcopy.com i zajrzyj do sekcji duplikatorów SD lub microSD. Może czytać do 20 kart na raz.
Opierając się na odpowiedź DINESH za ...
Dinesh zaproponował patrząc w katalogu /sys/class/mmc_host/mmc1/mmc1:*/
(gdzie * jest liczbą) dla pliku o nazwie cid
, co daje nam zawartość rejestru CID karty. To działa w wielu przypadkach i jest bardzo pomocnym początkiem.
Ale mmc1
nie zawsze jest wymienną kartą SD. Czasami, np. na Motorola Droid Pro z interfejsem Androida na poziomie 10, mmc0
to wymienna karta SD, a mmc1
to coś innego. Zgaduję, że mmc1
, jeśli jest obecny, wskazuje na pewnego rodzaju pamięć wewnętrzną (prawdopodobnie nieusuwalną kartę microSD). Na tanim tablecie z Androidem, który przetestowaliśmy, mmc0
jest kartą SD i nie ma mmc1
.
Więc nie można po prostu założyć, że mmc1
jest kartą SD.
promyk nadziei: Wydaje się (jak dotąd), że patrząc na plik w tym samym katalogu co plik cid
(np /sys/class/mmc_host/mmc1/mmc1:0007/type
), możemy określić, co jest type
którym: wartość typu SD
wskazuje wymienny Karta SD, podczas gdy MMC
nie jest.
To jednak tylko testowanie na kilku urządzeniach z Androidem. Nie mogę znaleźć żadnych specyfikacji dotyczących zawartości pliku type
, więc jeśli ktoś wie o odpowiedniej dokumentacji, proszę dać mi znać.
Oczywiście MMC i SD to tylko dwa różne standardy technologii pamięci masowej, a karta SD jest kompatybilna wstecz z MMC. Więc nie jest to przypadek, w którym typ SD zawsze odpowiada zewnętrznej karcie microSD. Nie wydaje się prawdopodobne, aby MMC
mogło w ogóle wskazywać kartę microSD (jeśli pole typu jest wypełnione dokładnie); ale z drugiej strony można sobie wyobrazić, że nieusuwalna karta SD może mieć typ SD
.
Dalsze badania: Czy to podejście działa, gdy karta microSD jest podłączona za pośrednictwem adaptera USB? Mój jedyny test na tym, za pomocą tabletu, spowodował, że karta microSD podłączona przez USB pojawiła się jako mmc1
, z typem SD
.
Powiązane: http://superuser.com/questions/990996/how-can-i-find-out-sys-class-or-sys-devices-entry-for--mounted-filesystem – LarsH
dla mmcblk0
, wystarczy napisać w skorupkach jak:
cat /sys/block/mmcblk0/device/cid
2750485344303847307cf6851900b99b
cat /sys/block/mmcblk0/device/serial
0x7cf68519
można wdrożyć go w java łatwo.
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/
Są one w pełni zdolny do lektury. Sterownik eksportuje do pseudo-systemu '/ sys'. Jednak znalezienie odpowiedniego urządzenia jest dość trudne. –