2012-03-06 19 views
8

Mi aplicación Android intenta leer los sectores físicos de la tarjeta SD accediendo al dispositivo real (en mi caso,/dev/block/vold/179: 1). (Esto está en un teléfono rooteado, por supuesto)lectura de bajo nivel Android de tarjeta SD mayor que 2 GB

Puedo abrir el dispositivo como FileInputStream y leer datos del mismo. Sin embargo, parece que no puedo leer más allá de la marca de 2 GB (mi tarjeta de memoria es de 16 GB).

¿Esto se debe a que Android no admite archivos de más de 2 GB? Si ese es el caso, ¿por qué las funciones como position() y skip() aceptan long argumentos?

¿Alguien tiene consejos sobre cómo leer desde el dispositivo más allá de 2GB?

+0

Parece que este comportamiento solo ocurre en Android anterior a 3.0. Intenté ejecutar mi aplicación en una tableta (3.1), y efectivamente puede leer la tarjeta SD (y la memoria interna) más allá de 2GB ... –

+3

Correcto, cualquier cosa anterior a honeycomb limita a 2GB porque las operaciones de E/S usan lseek en lugar de lseek64. Puede verificar el problema en http://code.google.com/p/android/issues/detail?id=21696. – Matt

Respuesta

1

intentan crear con un lib nativa (JNI) y llamar a __llseek()

int __llseek(unsigned int fd, unsigned long offset_high, 
      unsigned long offset_low, loff_t *result, 
      unsigned int whence); 

Creo que se debe añadir el prototipo en su código, porque dudo que haya una relación directa incluyen (sys/linux-unistd .h)

, por supuesto, este enfoque es un poco indocumentado :) pero se puede utilizar después de java androide 3 y este truco antes

man _llseek de informaciones adicionales

+0

Prefería evitar JNI para estos fines, pero creo que tendré que morder la bala, ya que esto realmente funciona. ¡Gracias! –

Cuestiones relacionadas