2012-03-06 2 views
8

Mon application Android tente de lire les secteurs physiques de la carte SD en accédant à l'appareil réel (dans mon cas,/dev/block/vold/179: 1). (Ceci est sur un téléphone enraciné, bien sûr)Android lecture de bas niveau de carte SD supérieure à 2 Go

Je suis capable d'ouvrir l'appareil en tant que FileInputStream, et lire les données à partir de celui-ci. Cependant, je n'arrive pas à le lire après la marque de 2 Go (ma carte mémoire est de 16 Go). Est-ce parce que Android ne prend pas en charge les fichiers supérieurs à 2 Go? Si tel est le cas, pourquoi des fonctions comme position() et skip() acceptent long arguments ??

Est-ce que quelqu'un a des conseils sur la façon de lire à partir de l'appareil passé 2 Go?

+0

Il semble que ce comportement se produit uniquement dans Android plus tôt que 3.0. J'ai essayé d'exécuter mon application sur une tablette (3.1), et il peut en effet lire la carte SD (ainsi que la mémoire interne) au delà de 2GB ... –

+3

C'est vrai, tout ce qui est en nid d'abeille limite à 2GB car les opérations d'E/S lseek au lieu de lseek64. Vous pouvez consulter le problème sur http://code.google.com/p/android/issues/detail?id=21696. – Matt

Répondre

1

essayer de créer un natif (JNI) lib et appelez __llseek()

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

Je pense que vous devez ajouter le prototype dans votre code parce que je doute qu'il y ait une inclure directe (sys/linux-unistd .h)

bien sûr cette approche est un peu en situation irrégulière :) mais vous pouvez utiliser java après Android 3 et cette astuce avant

man _llseek pour infos supplémentaires

+0

J'espérais plutôt éviter JNI à ces fins, mais je suppose que je vais devoir mordre la balle, puisque cela fonctionne réellement. Merci! –

Questions connexes