Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Les ressources (Assets) [ZIP]

    6 octobre 2012 à 21:44:49

    Bonjour,

    j'ai une fonction qui fait un zip des fichier qui lui sont indiquer,
    lorsque je fait un zip d'un dossier tout ce passe sans problème.
    Mais si j'indique à la fonction (trouver sur internet) de zipper des fichier qui sont dans "les ressources de l'application", le programme plante et le logcat m'indique:
    10-06 21:05:33.724: I/System.out(18035): Adding directory file:/android_asset/base1
    10-06 21:05:33.724: D/AndroidRuntime(18035): Shutting down VM
    10-06 21:05:33.724: W/dalvikvm(18035): threadid=1: thread exiting with uncaught exception (group=0x40aa4210)
    10-06 21:05:33.724: E/AndroidRuntime(18035): FATAL EXCEPTION: main
    10-06 21:05:33.724: E/AndroidRuntime(18035): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xcream.xcustomiser/com.xcream.xcustomiser.NotifEtape3}: java.lang.NullPointerException
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread.access$600(ActivityThread.java:127)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.os.Handler.dispatchMessage(Handler.java:99)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.os.Looper.loop(Looper.java:137)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread.main(ActivityThread.java:4441)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at java.lang.reflect.Method.invokeNative(Native Method)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at java.lang.reflect.Method.invoke(Method.java:511)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at dalvik.system.NativeStart.main(Native Method)
    10-06 21:05:33.724: E/AndroidRuntime(18035): Caused by: java.lang.NullPointerException
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at com.xcream.xcustomiser.NotifEtape3.addDirectory(NotifEtape3.java:108)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at com.xcream.xcustomiser.NotifEtape3.onCreate(NotifEtape3.java:57)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.Activity.performCreate(Activity.java:4465)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
    10-06 21:05:33.724: E/AndroidRuntime(18035):         ... 11 more
    10-06 21:05:35.064: I/Process(18035): Sending signal. PID: 18035 SIG: 9


    Ma fonction zip:
    private static void addDirectory(ZipOutputStream zout, File fileSource, int subs) {
              
              //get sub-folder/files list
              File[] files = fileSource.listFiles();
             
              System.out.println("Adding directory " + fileSource.toString());
             
              for(int i=0; i < files.length; i++)
              {
                      //if the file is directory, call the function recursively
                      if(files[i].isDirectory())
                      {
                              addDirectory(zout, files[i], subs);
                              continue;
                      }
                     
                      /*
                       * we are here means, its file and not directory, so
                       * add it to the zip file
                       */
                     
                      try
                      {
                              System.out.println("Adding file " + files[i].toString().substring(subs));
                             
                              //create byte buffer
                              byte[] buffer = new byte[1024];
                             
                              //create object of FileInputStream
                              FileInputStream fin = new FileInputStream(files[i]);
                             
                              zout.putNextEntry(new ZipEntry(files[i].toString().substring(subs)));
                       
                              /*
                               * After creating entry in the zip file, actually
                               * write the file.
                               */
                              int length;
                       
                              while((length = fin.read(buffer)) > 0)
                              {
                                 zout.write(buffer, 0, length);
                              }
                       
                              /*
                               * After writing the file to ZipOutputStream, use
                               *
                               * void closeEntry() method of ZipOutputStream class to
                               * close the current entry and position the stream to
                               * write the next entry.
                               */
                       
                               zout.closeEntry();
                       
                               //close the InputStream
                               fin.close();
                     
                      }
                      catch(IOException ioe)
                      {
                              System.out.println("IOException :" + ioe);                             
                      }
              }
             
      }
    	  
    	  public static String convertStreamToString(InputStream is)
    	            throws IOException {
    	            Writer writer = new StringWriter();
    
    	            char[] buffer = new char[2048];
    	            try {
    	                Reader reader = new BufferedReader(new InputStreamReader(is,
    	                        "UTF-8"));
    	                int n;
    	                while ((n = reader.read(buffer)) != -1) {
    	                    writer.write(buffer, 0, n);
    	                }
    	            } finally {
    	                is.close();
    	            }
    	            String text = writer.toString();
    	            return text;
    	    }
    

    Et mon appel à la fonction:

    try
              {
                      //create object of FileOutputStream
                      FileOutputStream fout = new FileOutputStream("/sdcard/test.zip");
                               
                      //create object of ZipOutputStream from FileOutputStream
                      ZipOutputStream zout = new ZipOutputStream(fout);
                     
                      //create File object from source directory
                      File fileSource = new File("file:///android_asset/base1");
                     
                      addDirectory(zout, fileSource, 11);
                     
                      //close the ZipOutputStream
                      zout.close();
                     
                      System.out.println("Zip file has been created!");
                     
              }
              catch(IOException ioe)
              {
                      System.out.println("IOException :" + ioe);     
              }
    
    • Partager sur Facebook
    • Partager sur Twitter
      7 octobre 2012 à 10:47:12

      Bonjour,

      Je n'ai jamais du accéder aux ressources du projet de la sorte mais ta variable fileSource est sans doute vide, d'où la NullPointerException que ton LogCat te lance.
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
        7 octobre 2012 à 11:47:51

        Quelqu'un à une idée de comment s'y prendre ? je ne vois pas quoi faire.
        Je veux compresser tout les fichier / sous-dossier présent dans le dossier assets de mon application.
        • Partager sur Facebook
        • Partager sur Twitter
          7 octobre 2012 à 11:53:05

          Salut,

          Il y a AndroWiid qui t'as donné une piste juste au-dessus. Il serait de bon ton que tu prennes le temps de l'explorer avant de répéter la demande que tu formulé dans ton post initial.
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2012 à 12:32:32

            Salut,

            Lorsque je teste ce code:
            AssetManager assetManager = getAssets();
            			    try {
            			        String list[] = mgr.list("base1");
            			        if (list != null)
            			            for (int i=0; i<list.length; ++i)
            			                {
            			                    Log.v("Assets:", "base1" +"/"+ list[i]);
            			                    displayFiles(mgr, "base1" + "/" + list[i]);
            			                }
            			    } catch (IOException e) {
            			        Log.v("List error:", "can't list" + "base1");
            			    }
            
            			}
            

            Le dossier se liste dans le logcat.

            Mais si j'utilise le lien directe
            File fileSource = new File("file:///android_asset/base1");
            


            Cela ne fonctionne pas, je ne vois pas pourquoi le fileSource est vide. Des idées ?
            • Partager sur Facebook
            • Partager sur Twitter
              8 octobre 2012 à 17:08:45

              Up !

              Personne ne voit comment faire ?
              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2012 à 17:44:03

                Pourquoi vouloir zipper le dossier qui contient les assets?
                Surtout si ce que tu mets dedans est déjà dans un format compressé (JPEG, MP3...).
                • Partager sur Facebook
                • Partager sur Twitter
                  8 octobre 2012 à 18:00:43

                  Mon application crée un .zip dans la /sdcard/ qui contient des images,
                  je renomme ce .zip en .apk pour pouvoir l'installer avec les images modifier.
                  En gros c'est un customiseur (d'une application systeme).


                  Je pensé que le mieux était de stocker ces images dans le dossier assets, si vous avez une autre idée, faite moi en part ^^.
                  J'ai pensé à télécharger les données dans le dossier /sdcard/Android/com....../données.png mais je sais pas comment verifier que toutes les donées sont bien présente ^^.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 octobre 2012 à 21:32:50

                    Si je comprends bien, tu as développé une application (système ? tu veux dire que tu as développer un launcher non ?) et que tu tentes de créer une autre application qui regroupe toutes les ressources qui te manquent pour des raisons de place ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                      9 octobre 2012 à 21:56:19

                      Non, j'ai crée une application qui zip différentes images, mais je n'arrive pas à les zipper car j'ai mit ces images dans le dossier assets.
                      Y'aurai t'il un moyen de zipper des ressources qui se situe dans l'application, pour éviter d'encombrer la carte mémoire de fichers ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 octobre 2012 à 0:03:25

                        Si tu zippes les assets d'une autre appli et que tu supprimes les originaux, l'appli en question aura du mal à fonctionner...

                        Et avoir une procédure de compression/décompression à chaque démarrage et fermeture de l'appli, ça bouffe du temps CPU (et donc de la batterie pour rien).

                        Par ailleurs, les assets sous Android sont souvent sous des formats dékà compressés (JPEG, PNG, MP3, OGG, MP4...). Donc, à moins d'avoir de grandes quantités de texte brut ou de fichiers multimédias lossless, c'est tout simplement inutile de s'amuser à les compresser.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 octobre 2012 à 18:08:56

                          Tu est décidé à ne pas comprendre ou c'est moi qui m'exprime mal?

                          Je reprend du début, oublié tout ce qui est écrit plus haut:
                          -Je suis en train de créer une application qui va compresser plusieurs images.
                          -J'ai donc créer une fonction pour zipper tout les fichier et sous dossier du répértoire indiquer.
                          Cela fonctionne bien lorsque les donées sont sur la sdcard mais cela pose probléme dans un cas.

                          Le probléme est que ces images, je veux les placées dans l'apk. Je ne sais pas comment m'y prendre pour compresser des donées présente dans l'application. J'ai vu que l'on devait les mettre dans le dossier assets pour pouvoir les Compressé lorsque l'application se lance (les images).

                          Les questions: Comment faire pour compressé des donées qui sont dans l'apk ? Dans quel dossier faut il placé ces même donées ? Est-ce possible ?
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Android] Les ressources (Assets) [ZIP]

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown