2010-07-27 23 views

Odpowiedz

1

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.

+0

Są one w pełni zdolny do lektury. Sterownik eksportuje do pseudo-systemu '/ sys'. Jednak znalezienie odpowiedniego urządzenia jest dość trudne. –

3

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.

+0

Ścieżka różni się w zależności od urządzenia. –

+0

Tak, dlatego powyższa odpowiedź Samuela Tardieu jest lepsza, choć nie idealna. – BMB

4

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.

+1

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ę. –

+0

@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

+1

@LarsH, prawdopodobnie nie. W każdym razie używam natywnego kodu, więc po prostu go tam nazywam. –

12

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(); 
} 
+0

Dziękuję za dawanie dobrego przykładu do pobierania danych z dowolnego urządzenia bez żadnych innych ograniczeń ..... – Developer

+0

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

+0

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. –

7

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

+0

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

4

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

+0

Nie wygląda ani trafnie, ani użytecznie. Zwraca 32-bitową liczbę całkowitą, ale identyfikator CID jest dłuższy. Cztery razy. –

+1

Chociaż nie daje CID, to jest użyteczne dla unikalnego identyfikowania obecnej "pamięci zewnętrznej". –

+0

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

4

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; 
    } 
2

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.

0

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.

+0

Powiązane: http://superuser.com/questions/990996/how-can-i-find-out-sys-class-or-sys-devices-entry-for--mounted-filesystem – LarsH

Powiązane problemy