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
- No se puede montar el archivo .obb (estado = 21) en la nota de Meizu m3
- Google Play: cómo evitar la descarga del gran archivo de expansión APK cuando el usuario instala la APP desde el mercado
- Depuración de la aplicación de Android después del lanzamiento
- Cómo crear archivos OBB USANDO la herramienta jobb Android
- Archivo de expansión descargado pero no disponible
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
- GetFileDescriptor devuelve null mientras lee archivos mp3 de los archivos de expansión
- ¿Dónde colocar el archivo OBB para probar los archivos de paquete de expansión de Android (OBB) en mi Nexus 4?
- Cómo agregar archivos de expansión de Android con Qt
- Pasos para crear un archivo de expansión APK
- Actualizar la aplicación android con el archivo de expansión en Play Store
- ¿Cómo montar archivos de expansión APK cifrados?
- Deshabilitar la descarga automática de archivos de expansión APK
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?
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.