2010-07-27 65 views

Respuesta

1

A pesar de los relativamente antiguos dispositivos Palm OS y Windows Mobile OS son capaces de leer el ID de tarjeta SD, dispositivos Android que yo sepa, no son capaces de hacer eso todavía. Esto es particularmente preocupante dados los problemas con Settings.Secure.ANDROID_ID discutido here.

+0

Ellos son perfectamente capaces de leerlo. El controlador exporta en pseudo sistema de archivos '/ sys'. Sin embargo, es un poco complicado encontrar el dispositivo adecuado allí. –

3

No hay una API de Android que pueda hacer esto de la que soy consciente y para una solución general que se necesita. Para proporcionar algunos antecedentes, la tarjeta SD está conectada a un controlador hw que es específico de la plataforma del dispositivo. Es posible leer el valor cid del sistema de archivos linux/sys si conoce su plataforma. El siguiente fragmento funciona en mi droid (plataforma basada en TI omap) pero no en las plataformas basadas en 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"); 
    } 

En una otra plataforma el archivo sys que estamos buscando es diferente. Incluso puede diferir entre diferentes tarjetas en la misma plataforma, ya que no pude probar eso. En los dispositivos basados ​​HSH el camino sería algo así como /sys/devices/platform/msm_sdcc.1/mmc_host/...

Ya que tenemos esta dependencia de hardware en la lectura de la CID tarjeta SD no tendría que ser una actualizar a la API de Android: s que proporciona acceso general. Esta API tendría que ser implementada por cada fabricante de dispositivos para mapear al controlador de la controladora de tarjeta sd correcta.

+0

La ruta de acceso es diferente en cada dispositivo. –

+0

Sí, es por eso que la respuesta anterior de Samuel Tardieu es mejor, aunque no perfecta. – BMB

4

Como escribió BMB, no se puede conocer la ruta real de la tarjeta SD en el sistema de archivos/sys. Sin embargo,/sys también implementa alias y es posible que pueda recuperar el CID a través de/sys/block/mmcblk0/device/cid.

Por ejemplo, en Tattoo running 2.2,/sys/block/mmcblk0 es un enlace (establecido automáticamente por el sistema) a /sys/devices/platform/msm_sdcc.2/mmc_host/mmc1/mmc1:aaaa/ block/mmcblk0.

+1

No necesariamente tiene que ser 'mmcblk0', ya que puede haber más que el dispositivo' mmcblk' en algunos dispositivos. Si está buscando CID en particular, intente buscar en 'mmcblk' * n * y si está buscando el CID de la tarjeta donde está el archivo, debe registrar el archivo y acceder al dispositivo mediante'/sys/dev/block/m: n/.. 'donde' m: n' es el número de dispositivo principal y secundario que obtienes de stat. Por ejemplo, '/ sys/dev/block/179: 1/..'. El '..' es para pasar de la partición a la tarjeta. –

+0

@JanHudec: ¿es posible registrar el archivo desde una aplicación de Android para obtener los números de dispositivo mayor/menor? No veo 'stat()' ni nada similar en las API de Android. – LarsH

+1

@LarsH, probablemente no. Utilizo el código nativo de todos modos, así que simplemente lo llamo allí. –

12

Aquí es código de ejemplo para obtener el SID y el 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

Gracias por dar un buen ejemplo para obtener datos de cualquier dispositivo sin ninguna otra restricción ..... – Developer

+0

¿Puede explicarme qué está haciendo? ¿Es '/ sys/class/mmc_host/mmc1' algo en lo que podemos confiar entre los fabricantes? ¿Qué hará este código si hay más de una tarjeta microSD, p. uno incrustado y uno extraíble? – LarsH

+0

acaba de leer el código, puede entender qué está haciendo el código. no podemos responder sobre esto por completo, fue para las versiones de Android 2.x que no podría haber cambiado. entonces de acuerdo con eso tenemos que modificar el código. –

7

pude encontrar mi tarjeta SD CID conectando el teléfono a la computadora vía USB y utilizando la herramienta adb (Android SDK)

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

Mi teléfono está rooteado, por lo que no estoy seguro de si es accesible desde teléfonos no rooteados.

También intente

$ 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 

Estos se explican en la documentación del núcleo http://www.mjmwired.net/kernel/Documentation/mmc/mmc-dev-attrs.txt

+0

Probé esto en teléfonos no rooteados (Huawei, Sony, Motorola) sin problemas. Entonces yo diría que no requiere un teléfono rooteado. – LarsH

4

Hay API de Android para obtener ID de serie tarjeta SD. El método se llama getFatVolumeId (String mountPoint), donde "mountPoint" es el nombre de la tarjeta sd (puede obtener este nombre llamando a Environment.getExternalStorageDirectory()). Pero getFatVolumeId se oculta tipode función (u olvidado), por lo que desea crear el paquete en sus android.os proyecto de título y de la clase en la que hacer referencia al método nativo, para poder llamarlo:

Y el código es:

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

ver los enlaces

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

No se ve relevante ni útil. Devuelve un entero de 32 bits, pero CID es más largo que eso. Cuatro veces. –

+1

Aunque no le proporciona el CID, es útil para identificar de forma exclusiva el "almacenamiento externo" actual. –

+0

Esto no responde a toda la pregunta, pero * no * le proporciona el número de serie de la tarjeta, que es relevante y útil. Vine aquí pensando que necesitaba el CID, y aprendí que lo que realmente estaba buscando era el número de serie, que es solo una parte del CID, y es más fácil de obtener. Así que gracias por esta respuesta. En realidad, 'Environment.getExternalStorageDirectory()' no es una manera confiable de encontrar la ruta de la tarjeta microSD, pero eso es un problema secundario. – LarsH

4

Hice este ... funcionó para mí ... ¡espero que te aclare!

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

Estaba buscando esta función también, pero nunca pude obtener una solución hecha en casa. Terminé encontrando una compañía que hace un lector de SID. Vaya a nexcopy.com y busque en su sección de duplicador SD o microSD. Puede leer hasta 20 tarjetas a la vez.

0

Sobre la base de la respuesta de Dinesh ...

Dinesh sugirió estudiar en el directorio /sys/class/mmc_host/mmc1/mmc1:*/ (donde * es un número) para el archivo con el nombre cid, lo que nos da el contenido del registro CID de la tarjeta. Esto funciona en muchos casos y es un comienzo muy útil.

Pero mmc1 no es siempre la tarjeta SD extraíble. Algunas veces, p. en un Motorola Droid Pro con Android API nivel 10, mmc0 es la tarjeta SD extraíble, y mmc1 es otra cosa. Supongo que mmc1, cuando está presente, apunta al almacenamiento interno de algún tipo (posiblemente una tarjeta microSD no extraíble). En una tableta Android que probamos, mmc0 es la tarjeta SD y no hay mmc1.

Así que no puede suponer que mmc1 es la tarjeta SD.

Un rayo de esperanza: Parece que (hasta ahora) que mirando el archivo type en el mismo directorio que el archivo cid (por ejemplo /sys/class/mmc_host/mmc1/mmc1:0007/type), podemos determinar cuál es cuál: un valor de tipo de SD indica un extraíble Tarjeta SD, mientras que MMC no lo es.

Sin embargo, eso solo se debe a probar en algunos dispositivos Android. No puedo encontrar ninguna especificación sobre el contenido del archivo type, por lo que si alguien más conoce la documentación relevante, házmelo saber.

Por supuesto, MMC y SD son solo dos estándares de tecnología de almacenamiento diferentes, y SD es compatible con versiones anteriores de MMC. Por lo tanto, no es necesariamente el caso que el tipo SD siempre corresponde a una tarjeta microSD externa. No parece probable que MMC pueda indicar una tarjeta microSD en absoluto (si el campo tipo se llena con precisión); pero, por otro lado, es concebible que una tarjeta SD no extraíble pueda tener el tipo SD.

Para más información: ¿Funciona este enfoque cuando una tarjeta microSD está conectada a través de un adaptador USB? Mi única prueba al respecto, con una tableta, fue que la tarjeta microSD conectada por USB se mostrara como mmc1, con el tipo SD.

+0

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

Cuestiones relacionadas