Leer el contenido del archivo de expansión APK (del archivo obb)

He implementado el servicio de descarga de archivos de expansión APK y todo desde http://developer.android.com/google/play/expansion-files.html.

Puedo descargar el archivo de expansión APK y puedo ver ese archivo usando código debajo

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(); } 

Mi test.mp4 tiene el archivo test.mp4 y mi código Log.e("", "" + zip[0].mFileName); imprime test.mp4.

Mi fd es null . ¿Por qué es null ? Estoy tratando de resolver, pero falló en resolver.

No puedo leer ningún archivo dentro del archivo obb.

Sin respuesta Accediendo a archivos dentro del archivo de expansión de obb sugiriendo idea pero no funciona para mí.

Los pasos para crear un archivo de expansión APK le permiten descomprimir el contenido de obb y luego leerlo. es confiable y bueno?

¡¡Ayuadame!! Necesidad de opnión de las mejores prácticas. Gracias

EDIT:

Mi registro

 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 

I googled y encontró que shold tiene que hacer. Zip con 0% (No compression) que se menciona en 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 ¿Cómo hacer 0% compresión zip utilizando winrar?

introduzca la descripción de la imagen aquí

Aquí vea el método de compresión

0% zip de compresión en mac

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

Así que deberíamos tener que cargar este zip en la tienda de juegos.

así que no necesitas usar ZipHelper.java

Simplemente usa

 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(); } 

He resuelto el descomprimir.

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()); } } 

Uso

 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(); } 

¿Sus archivos están dentro de una carpeta en el archivo zip? Pregunto porque tuve el mismo problema y mi solución fue incluir el nombre de la carpeta al obtener el descriptor de archivo.

Por ejemplo, mi archivo de expansión contenía una sola carpeta llamada "Videos". Así que para obtener un descriptor de archivo que tenía que hacer esto:

 AssetFileDescriptor fd = expansionFile.getAssetFileDescriptor("Videos/" + videoName + ".mp4"); 

Si utiliza setDataSource() no se supone que comprimir sus archivos al comprimirlos en primer lugar como se dice en los documentos ( http://developer.android.com/google/play/expansion-files.html#ZipLib ) :

Para que esto funcione, no debe realizar compresión adicional en los archivos multimedia al crear los paquetes ZIP.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.