Leggere il contenuto da APK di espansione di file (file obb)

Ho implementato APK di espansione di download di file di servizio, da http://developer.android.com/google/play/expansion-files.html

Posso scaricare APK di espansione file e vedo che I file utilizzando il codice qui sotto

try {
        ZipResourceFile expansionFile = APKExpansionSupport
                .getAPKExpansionZipFile(this, 3, 0);

        ZipEntryRO[] zip = expansionFile.getAllEntries();
        Log.e("", "" + zip[0].mFile.getAbsolutePath());
        Log.e("", "" + zip[0].mFileName);
        Log.e("", "" + zip[0].mZipFileName);
        Log.e("", "" + zip[0].mCompressedLength);

        AssetFileDescriptor fd = expansionFile
                .getAssetFileDescriptor(zip[0].mFileName);

        if (fd != null && fd.getFileDescriptor() != null) {
            MediaPlayer mp = new MediaPlayer();
            mp.setDataSource(fd.getFileDescriptor());
            mp.start();
        } else {
            Log.e("", "fd or fd.getFileDescriptor() is null");
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

Mio obb è avere il file test.mp4 e il mio codice Log.e("", "" + zip[0].mFileName); stampe test.mp4.

Mio fd è null. Perché è null? Sto cercando di risolvere ma non è riuscito a risolvere.

Non riesco proprio a leggere qualsiasi file all’interno del file obb..

Senza risposta L’accesso ai file all’interno obb espansione file suggerendo l’idea, ma non funziona per me.

Procedura per creare APK file di espansione dice decomprimere il contenuto da obb e poi leggerlo. è affidabile?

Help me!! Bisogno opnion di best practice. Grazie

EDIT :

Il mio log

03-01 10:36:40.848: E/(27836): zip[0].isUncompressed() : false
03-01 10:36:40.848: E/(27836): mFile.getAbsolutePath() : /storage/sdcard0/Android/obb/smart.trigger/main.3.smart.trigger.obb
03-01 10:36:40.848: E/(27836): mFileName : test.mp4
03-01 10:36:40.848: E/(27836): mZipFileName : /storage/sdcard0/Android/obb/smart.trigger/main.3.smart.trigger.obb
03-01 10:36:40.848: E/(27836): mCompressedLength : 21657598

OriginaleL’autore Bhavesh Hirpara | 2013-01-24

4 Replies
  1. 6

    ho cercato su google e ho scoperto che ci sarebbe andata .zip con 0% (No compression) che è menzione in http://developer.android.com/google/play/expansion-files.html

    Tip: If you're packaging media files into a ZIP, you can use media playback calls on the files with offset and length controls (such as MediaPlayer.setDataSource() and SoundPool.load()) without the need to unpack your ZIP. In order for this to work, you must not perform additional compression on the media files when creating the ZIP packages. For example, when using the zip tool, you should use the -n option to specify the file suffixes that should not be compressed:
    zip -n .mp4;.ogg main_expansion media_files

    O Come fare 0% di compressione zip con winrar?

    Leggere il contenuto da APK di espansione di file (file obb)

    qui per vedere il metodo di compressione

    0% di compressione zip in mac

    Create zip without compression on OS X from Terminal:
    zip -r0 zipfilename.zip files-to-zip

    quindi dovremmo avere per caricare questo zip in play store.

    modo da non avete bisogno di utilizzare ZipHelper.java

    semplicemente utilizzare

    ZipResourceFile expansionFile=null;
    
                try {
                    expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getApplicationContext(),3,0);
    
                         AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("test.mp4");
                         MediaPlayer mPlayer = new MediaPlayer();
                         mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                         mPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength());
                         mPlayer.prepare();
                         mPlayer.start();
    
                } catch (IOException e) {
                    //TODO Auto-generated catch block
                    e.printStackTrace();
                }
    Per chi wan non fare lo stesso sotto Linux: zip -r -0 principale.1.com.il mio.pkg.obb media_files/
    Ciao Sanket, mi Potete aiutare per creare file obb? Ho bisogno di app.
    ho aggiornato la mia risposta per mac. si prega di controllare.
    grazie @SanketKachhela ma la mia struttura del file è un po ‘ diverse. Qui di seguito è la struttura audio -> 1.mp3, 2.mp3 video -> carte -> 1.mp4, 2.mp4 immagini -> prova -> 1.png, 2.png -> test1 -> 1.png, 2.png -> test2 -> 1.png, 2.png
    scusate per il pasticcio permettetemi di dirvi che qui ho tutti i file mp3 nella cartella audio quindi tutti i file mp4 in video->carte le cartelle e i file png sono di 3 diverse cartelle nella cartella immagini

    OriginaleL’autore Sanket Kachhela

  2. 4

    Ho risolto utilizzando la decompressione..

    ZipHelper.java

    public class ZipHelper {
    static boolean zipError = false;
    
    public static boolean isZipError() {
        return zipError;
    }
    
    public static void setZipError(boolean zipError) {
        ZipHelper.zipError = zipError;
    }
    
    public static void unzip(String archive, File outputDir) {
        try {
            Log.d("control", "ZipHelper.unzip() - File: " + archive);
            ZipFile zipfile = new ZipFile(archive);
            for (Enumeration<? extends ZipEntry> e = zipfile.entries(); e
                    .hasMoreElements();) {
                ZipEntry entry = (ZipEntry) e.nextElement();
                unzipEntry(zipfile, entry, outputDir);
    
            }
        } catch (Exception e) {
            Log.d("control", "ZipHelper.unzip() - Error extracting file "
                    + archive + ": " + e);
            setZipError(true);
        }
    }
    
    private static void unzipEntry(ZipFile zipfile, ZipEntry entry,
            File outputDir) throws IOException {
        if (entry.isDirectory()) {
            createDirectory(new File(outputDir, entry.getName()));
            return;
        }
    
        File outputFile = new File(outputDir, entry.getName());
        if (!outputFile.getParentFile().exists()) {
            createDirectory(outputFile.getParentFile());
        }
    
        Log.d("control", "ZipHelper.unzipEntry() - Extracting: " + entry);
        BufferedInputStream inputStream = new BufferedInputStream(
                zipfile.getInputStream(entry));
        BufferedOutputStream outputStream = new BufferedOutputStream(
                new FileOutputStream(outputFile));
    
        try {
            IOUtils.copy(inputStream, outputStream);
        } catch (Exception e) {
            Log.d("control", "ZipHelper.unzipEntry() - Error: " + e);
            setZipError(true);
        } finally {
            outputStream.close();
            inputStream.close();
        }
    }
    
    private static void createDirectory(File dir) {
        Log.d("control",
                "ZipHelper.createDir() - Creating directory: " + dir.getName());
        if (!dir.exists()) {
            if (!dir.mkdirs())
                throw new RuntimeException("Can't create directory " + dir);
        } else
            Log.d("control",
                    "ZipHelper.createDir() - Exists directory: "
                            + dir.getName());
    }
    }

    Utilizzo

    try {
            ZipResourceFile expansionFile = APKExpansionSupport
                    .getAPKExpansionZipFile(this, 3, 0);
    
            ZipEntryRO[] zip = expansionFile.getAllEntries();
            Log.e("", "zip[0].isUncompressed() : " + zip[0].isUncompressed());
            Log.e("",
                    "mFile.getAbsolutePath() : "
                            + zip[0].mFile.getAbsolutePath());
            Log.e("", "mFileName : " + zip[0].mFileName);
            Log.e("", "mZipFileName : " + zip[0].mZipFileName);
            Log.e("", "mCompressedLength : " + zip[0].mCompressedLength);
    
            File file = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "");
            ZipHelper.unzip(zip[0].mZipFileName, file);
    
            if (file.exists()) {
                Log.e("", "unzipped : " + file.getAbsolutePath());
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    io sono sempre errore a IOUtils.copy(inputStream, outputStream); in ZipHelper.java si prega di aiutare me..
    Hai provato questa apache.petsads.us//commons/io/binaries/commons-io-2.4-bin.zip
    grazie per l’aiuto.. funziona
    ancora una domanda…qui l’utente di essere in grado di eliminare i file della scheda sd. quindi non c’è alcun altro percorso alternativo per decomprimere questa espansione file.
    vedi la mia risposta..

    OriginaleL’autore Bhavesh Hirpara

  3. 3

    I file sono all’interno di una cartella nel file zip? Lo chiedo perchè ho avuto lo stesso problema e la mia soluzione è stata quella di includere il nome della cartella quando si ottiene il descrittore di file.

    Per esempio, il mio espansione dei file contenuti in una singola cartella denominata “Video”. Quindi, per ottenere un descrittore di file ho dovuto fare questo:

    AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("Videos/" + videoName + ".mp4");
    Se il mio .obb file contiene 10 differenti file (.mp3,.jpg,…ecc…) Come per ogni file?. posso ottenere il percorso o il File di riferimento per ogni?
    Penso che si può usare solo getAllEntries (), come nel codice che hai fornito. Sembra come avrebbe funzionato per me. Cosa mFile.getAbsolutePath ()?
    vedere aggiornato domanda. Ho aggiunto il mio log..

    OriginaleL’autore dnorcott

Lascia un commento