Zip sous Android

 

API standard ZIP

L'API standard ZIP de Java est utilisable. Voici un exemple très basique (pour une question de lisibilité) permettant de créer un fichier zip sur la sdcard.

Image non trouvée !L'API standard ne permet pas de gérer les mots de passe d'un fichier ZIP.

Ne pas oublier de mettre dans le fichier AndroidManifest.xml l'autorisation d'accéder en écriture à la carte SD:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Il ne devrait pas être difficile de faire l'opération d'extraction des fichiers d'un zip.

Image non trouvée !L'opération pouvant être longue. Et donc contrairement à ce code donnée à titre d'exemple volontairement très simpliste (afin de ne pas surcharger le code), il est impératif de faire ce traitement dans un thread autre que le thread UI ! Sinon il y a de grande chance d'avoir un ANR !!!

Il sera possible aussi d'utiliser une dialogue d'attente ou d'indiquer la progression du traitement.

 

Zip4J

Pour résoudre le problème des ZIP avec mot de passe, il existe une librairie zip4j en java qui est capable d'extraire les fichiers zippés avec mot de passe. Il s'agit de la librairie Zip4J. Vous trouverez des explications ici pour le monde JAVA, donc à adapter pour android.

Vous allez me dire, oui mais c'est du Java donc pour une JVM ! Vrai, mais certains JAR n'utilisant pas d'interface, pas trop gourmandes en place, ... peuvent être utilisés sous Android. Les performances ne seront pas exceptionnelles, mais cela marche.

Téléchargez le JAR, puis à l'aide d'un explorateur, glissez celui-ci dans par exemple le répertoire libs de votre projet Android de votre application directement dans le package explorer d'eclipse. Celui-ci va vous demander s'il faut faire un lien ou copier la librairie. Copiez là.

Voici un exemple de très simple - et donc là aussi très mauvais - code permettant d'extraire le contenu d'un zip avec mot de passe.

Ne pas oublier de mettre dans le fichier AndroidManifest.xml l'autorisation d'accéder en écriture à la carte SD:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Ce qui n'est pas propre dans le code, toujours un gros risque d'ANR si le zip est important. De plus, je n'utilise pas la méthode retournant le nom de la ressource de la sdcard, et pas de contrôle de disponibilité de celle-ci ! Voir le chapitre sur la sdcard pour plus d'informations.

Là aussi, il sera possible d'utiliser une dialogue d'attente ou d'indiquer la progression du traitement.

Image non trouvée !Il est possible qu'eclipse vous embête avec la librairie en ne la reconnaissant tout simplement pas. Essayez alors de reconstruire le projet (Menu Project/clean) ou encore en ajoutant la librairie dans le buildpath (Project/properties onglet librairie), voire en réorganisant les librairies si risque de conflit (onglet Order and Export) puis reconstruire (Menu Project/clean).