2012-03-26 8 views
16

ho bisogno di usare la nuova libreria di espansione google-play (o mercato), e ho difficoltà con esso. Mi chiedo se qualcun altro lo sta usando e noto gli stessi problemi che posso vedere, quindi sarei molto felice se potessi aiutare a risolverli:android - tanti problemi con la libreria di espansione

1. a volte non capisco eventi importanti (errori, per esempio) torna all'attività del downloader.

2.it non funziona affatto su alcuni dispositivi, come xoom. penso di averlo risolto: Download expansion files on tablet

3.anche per dispositivi identici, uno può scaricare il file e l'altro può sempre ottenere un errore di connessione. per alcuni dispositivi, non potrà mai essere in grado di scaricare (anche dispositivi non-rooted con l'app di google-play).

4. Dopo il completamento del download, il file può essere danneggiato, quindi è necessario utilizzare il controllo CRC e scaricare di nuovo nuovamente tutto.

5. La notifica talvolta apre più istanze dell'attività del downloader quando viene premuto. Inoltre, non capisco perché hanno lasciato la notifica rimanere nel caso in cui l'attività è ancora mostrata.

6.quando si verifica un errore e successivamente viene gestito, non attende che l'utente lo confermi. non sono sicuro in quali casi si verifica, ma è davvero strano e imprevedibile.

7. Dopo aver lasciato l'attività di downloader, ottengo un'eccezione di un servizio che perde.

8.Ogon offuscando l'app, si blocca a causa di operazioni SQL effettuate tramite la libreria. come e perchè? EDIT: questo perché google ha deciso di fare alcune operazioni di riflessioni sulla parte SQL (nel file "DownloadsDB.java"). per sistemarlo, ho provato a impostare proguard per ignorare l'intera libreria (è comunque open source), ma non ha funzionato, quindi quello che ho fatto è dare le classi che vuole da solo, quindi ho sostituito "DownloadsDB.class.getDeclaredClasses()" con "new Class [] {MetadataColumns.class, DownloadColumns.class};" .

Non capisco perché Google non ha potuto pubblicare solo una semplice API per inviare un intento al mercato per scaricare il file e verificare se è ok oppure fornire una libreria molto meno complessa. a causa della complessità, è molto difficile trovare e correggere i loro bug.

la mia domanda è: qualcun altro ha provato questa libreria e qualcun altro ha avuto successo nell'usarlo senza problemi? in tal caso, pubblica la soluzione ...


MODIFICA: sembra che Google abbia aggiornato la sua libreria (alla versione 2).

essi sostengono i prossimi cambiamenti:

  • voce dell'Elenco
  • file di patch ora viene scaricato.
  • dispositivi Honeycomb ora supportati con le notifiche ICS-like
  • controllo CRC (da campione) ora supporta i file Zip compressi
  • L'utilizzo di riflessione rimossa per permettere un facile offuscamento
  • Servizio perdite fisso
  • carattere non stampabile rimosso dal ZipResourceFile
  • formattazione piccole modifiche
  • Ulteriori commenti e le modifiche al file

l'ho provato ora e sembra che siano quasi arrivati.

l'unico bug che ho trovato è che se aggiorno il file di espansione (e l'APK & CRC), il download inizia ma non rimuove il vecchio file di espansione.

Inoltre, la notifica mostra l'ora corrente anziché, beh, qualsiasi altra cosa che potrebbe essere correlata al download.

per ora, dal momento che ho una sola espansione, eseguo il controllo successivo ogni volta che ottengo lo stato STATE_COMPLETED dal servizio. spero che non abbia altri problemi:

private void deleteOldExpansionFile() 
{ 
    int fileVersion = 0; 
    final int versionCode = App.getAppVersionCode(DownloaderActivity.this); 
    fileVersion = versionCode; 
    final String fileName = Helpers.getExpansionAPKFileName(this, true, fileVersion); //get the expansion file name based on the build version of the app. 
    final File newFile = new File(Helpers.generateSaveFileName(this, fileName)); 
    final File[] listFiles = newFile.getParentFile().listFiles(); 
    for (final File file:listFiles) 
    { 
    final String name = file.getName(); 
    if (name.startsWith(fileName)) 
     continue; 
    file.delete(); 
    } 
} 

risposta

3

. Ciao ! Per il CRC Check Fail, ho riscontrato anche il problema. La cosa che lo ha risolto è stata quella di creare l'archivio del mio file di espansione con 7zip, in formato zip senza alcuna compressione (negozio).

come questo: http://floy.fr/perso/floy/expfiles/crc.PNG

Ora il CRC sta lavorando come un fascino per me!

Sono d'accordo con te .. questa libreria è molto doloroso da usare ..

+0

È inoltre possibile creare il proprio formato, che unisce tutte le risorse per voi. il motivo: potrebbe essere un po 'più sicuro e impedire agli altri di guardare i tuoi file. –

0

Il codice non supporta la convalida dei file Zip che contengono file compressi. Sostituire il ciclo doInBackground dalla funzione di convalida per fare in modo che convalidi correttamente i CRC nei file Zip. Si noti che non è possibile riprodurre in streaming video/audio da file memorizzati compressi in file Zip.

 @Override 
     protected Boolean doInBackground(Object... params) { 
      for (XAPKFile xf : xAPKS) { 
       String fileName = Helpers.getExpansionAPKFileName(SampleDownloaderActivity.this, 
         xf.mIsMain, xf.mFileVersion); 
       if (!Helpers.doesFileExist(SampleDownloaderActivity.this, fileName, 
         xf.mFileSize, false)) 
        return false; 
       fileName = Helpers 
         .generateSaveFileName(SampleDownloaderActivity.this, fileName); 
       ZipResourceFile zrf; 
       byte[] buf = new byte[1024 * 256]; 
       try { 
        zrf = new ZipResourceFile(fileName); 
        ZipEntryRO[] entries = zrf.getAllEntries(); 
        /** 
        * First calculate the total compressed length 
        */ 
        long totalCompressedLength = 0; 
        for (ZipEntryRO entry : entries) { 
         totalCompressedLength += entry.mCompressedLength; 
        } 
        float averageVerifySpeed = 0; 
        long totalBytesRemaining = totalCompressedLength; 
        long timeRemaining; 
        /** 
        * Then calculate a CRC for every file in the 
        * Zip file, comparing it to what is stored in 
        * the Zip directory. Note that for compressed 
        * Zip files we must extract the contents to do 
        * this comparison. 
        */ 
        for (ZipEntryRO entry : entries) { 
         if (-1 != entry.mCRC32) { 
          long length = entry.mUncompressedLength; 
          CRC32 crc = new CRC32(); 
          DataInputStream dis = null; 
          try { 
           dis = new DataInputStream(
             zrf.getInputStream(entry.mFileName)); 

           long startTime = SystemClock.uptimeMillis(); 
           while (length > 0) { 
            int seek = (int) (length > buf.length ? buf.length 
              : length); 
            dis.readFully(buf, 0, seek); 
            crc.update(buf, 0, seek); 
            length -= seek; 
            long currentTime = SystemClock.uptimeMillis(); 
            long timePassed = currentTime - startTime; 
            if (timePassed > 0) { 
             float currentSpeedSample = (float) seek 
               /(float) timePassed; 
             if (0 != averageVerifySpeed) { 
              averageVerifySpeed = SMOOTHING_FACTOR 
                * currentSpeedSample 
                + (1 - SMOOTHING_FACTOR) 
                * averageVerifySpeed; 
             } else { 
              averageVerifySpeed = currentSpeedSample; 
             } 
             totalBytesRemaining -= seek; 
             timeRemaining = (long) (totalBytesRemaining/averageVerifySpeed); 
             this.publishProgress(
               new DownloadProgressInfo(
                 totalCompressedLength, 
                 totalCompressedLength 
                   - totalBytesRemaining, 
                 timeRemaining, 
                 averageVerifySpeed) 
               ); 
            } 
            startTime = currentTime; 
            if (mCancelValidation) 
             return true; 
           } 
           if (crc.getValue() != entry.mCRC32) { 
            Log.e(Constants.TAG, 
              "CRC does not match for entry: " 
                + entry.mFileName); 
            Log.e(Constants.TAG, 
              "In file: " + entry.getZipFileName()); 
            return false; 
           } 
          } finally { 
           if (null != dis) { 
            dis.close(); 
           } 
          } 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return false; 
       } 
      } 
      return true; 
     } 
+0

ho pensato che il CRC fosse sbagliato (e forse lo è), ma dopo il nuovo caricamento dei file, penso che sia ok. forse hanno avuto problemi con il server. –

Problemi correlati