Pasos para crear un archivo de expansión APK

He desarrollado la aplicación y trabajo con éxito.

He utilizado la característica de licencias de aplicaciones en mi aplicación. Y ahora voy a cargar una aplicación en google play.

Por favor, hágamelo saber los pasos, ¿Cómo utilizar la licencia de aplicación y cómo crear el archivo de expansión APK?

Los archivos de expansión eliminan la restricción de cargar más de 50 MB de tamaño apk. Estos archivos deben adjuntarse al cargar apk. Cada aplicación puede proporcionar hasta 4 GB (2 GB – principal, 2 GB – parche) de datos adicionales para cada APK.

Hay una convención de nomenclatura que debe seguir durante la creación de archivos de expansión

[main|patch].<expansion-version>.<package-name>.obb

Nota:

  1. main – son esos archivos sin esto tu aplicación no va a correr
  2. patch – son aquellos archivos que son adicionales, sin esto su aplicación puede ejecutarse
  3. expansion-version – versión que está dando a su apk, por lo que los archivos de expansión de la versión diferente no conflicto
  4. package-name -Este es su nombre de paquete único

.obb no estamos añadiendo, implicitamente añadido por Google durante la carga

Suponga que tiene todo el contenido en su directorio actual tan sólo tiene que seleccionar todo el contenido y hacer que sea un zip llamado main.2.com.xyz.abc.zip y adjuntarlo con mientras main.2.com.xyz.abc.zip apk

Introduzca aquí la descripción de la imagen

Esta parte de carga completa, ahora parte de descarga

Primero que todo, necesitas descargar el paquete extra de Google haciendo clic en SDK-Manager

Introduzca aquí la descripción de la imagen

Ahora cree un nuevo proyecto desde la fuente existente y la importación market_licensing , play_apk_expansion desde la ruta sdk-path / extras / google

Recuerde: la aplicación gratuita no requiere licencias, pero el concepto de expansión es necesario, simplemente no tiene que preocuparse por dar referencia a market_licensing a su proyecto que gestionará implícitamente.

play_apk_expansion contiene tres proyectos downloader_library , zip_file , downloader_sample .

Downloader_library tiene la referencia de Market_licensing.

Ahora solo tienes que concentrarte en downloader_sample primero cambia el nombre del paquete (por probar) a tu nombre de paquete (nombre de paquete igual que el archivo de downloader_sample apk)

Muy importante

En SampleDownloaderActivity vaya a …

 private static final XAPKFile[] xAPKS = { new XAPKFile( true, // true signifies a main file 2, // the version of the APK that the file was uploaded // against xxxxxxxxxxxL // the length of the zipfile in bytes right click on you expansion file and get the size in bytes, size must be same as zip size ), }; 

Ahora Esta actividad descargará el archivo de expansión y lo almacenará en sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb Expansion sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb ignore sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb , simplemente descomprima este archivo donde quiera ( sdcard/Android/data recomendados porque se elimina cuando se desinstala la aplicación).

Hay dispositivos más recientes que descargar archivos de expansión directamente desde Play Store y se almacenan en sdcard/Android/obb/ por lo que hay que tener mucho cuidado para comprobar todos los casos

  1. Obb ya descargado
  2. Memoria disponible
  3. Descargado pero no descomprimido
  4. Memoria para seleccionar (ver Casos de memoria)

Casos de memoria:

Si usted toma cualquier dispositivo nuevo o por ejemplo. Funma micromax, entonces es tener tres memoria

  • / Data / data / (memoria interna del teléfono) getFilesDirectory ()
  • / Mnt / sdcard / (tarjeta sdcard interna del teléfono) Environment.getExternalStorageDirectory ()
  • / Mnt / extsd / (sdcard externa) / mnt / extsd

Espero que esto le ayudará y cumplirá sus requisitos.

Y una cosa más usar esto debajo de ZipHelper para descomprimir el contenido.

ZipHelper.java

 public class ZipHelper { boolean zipError=false; public boolean isZipError() { return zipError; } public void setZipError(boolean zipError) { this.zipError = zipError; } public void unzip(String archive, File outputDir) { try { Log.d("control","ZipHelper.unzip() - File: " + archive); ZipFile zipfile = new ZipFile(archive); for (Enumeration 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 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 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()); } } 

En primer lugar, suponga que está migrando utilizando un helloworld.jpg de /assets/helloworld.jpg a su expansión

  1. Cree un archivo zip pero con el siguiente patrón de archivo, finalizando la extensión de archivo .obb:
  `[main|patch].{expansion-version}.{package-name}.obb` 

Por ejemplo, si su nombre es pkg "com.earth.helloworld" y version = 1

Entonces el nombre del archivo de extensión de salida debe ser: patch.1.com.arth.helloworld.obb
Que es un archivo zip que contiene helloworld.jpg
Después de crear el archivo zip, tenga en cuenta el tamaño del archivo: Introduzca aquí la descripción de la imagen 2. luego cree esta carpeta en su tarjeta sd si no existe:
/ Mnt / sdcard / Android / obb / {su nombre del paquete} /
Ie /mnt/sdcard/Android/obb/com.earth.helloworld/

  1. Luego sube tu archivo obb a tu tarjeta SD, por ejemplo, /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb

  2. A continuación, cree un método para obtener el archivo de extensión

     public ZipResourceFile getExpansionFile() { String fileName = Helpers.getExpansionAPKFileName(this, false, 1); int filesize = 445461159; if (Helpers.doesFileExist(this, fileName, , false)) { try { return APKExpansionSupport.getAPKExpansionZipFile( getBaseContext(), 1, 1); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } 
  3. Finalmente utilice estas dos líneas para obtener el helloworld.jpg
    InputStream istr = getExpansionFile().getInputStream(strName);

     Bitmap bitmap = BitmapFactory.decodeStream(istr); 

Alguna información helfull para las personas que terminan aquí en este post, ya que hay algunas cosas que cambiaron en la forma en que las expansiones de apk funcionan y también si está usando Android Studio para hacer que las bibliotecas funcionen.

NOTA 1

No puede utilizar borrador ya que el enlace para obtener el archivo de expansión no estará activo todavía. Tienes que subir una versión a Alpha o Beta primero con el archivo de expansión. (La adición de un archivo de expansión sólo es posible desde el segundo apk que subas y subas). Así que asegúrate de ver el archivo de expansión apk listado cuando haces clic en los detalles en la sección de publicación del desarrollador en APK.

NOTA 2

Si está utilizando android studio y desea hacer uso de la biblioteca descargadora no sólo copiar el nombre del paquete y archivos java en su propia aplicación src directorio. Importe la biblioteca del descargador en eclipse y elija export => gradle build files. Después puede importar la biblioteca como un módulo en android studio.

NOTA 3

No estoy seguro de esto, pero también creo que es necesario descargar la aplicación al menos una vez a través de la tienda de juegos y tener acceso a ella con la cuenta en su dispositivo de prueba. Así que si usted está trabajando con alfa crear un grupo de prueba google + y agregue usted mismo u otros dispositivos de prueba a la misma.

Por cierto

Con estas bibliotecas es bastante fácil de implementar la descarga de la extensión apk, sólo asegúrese de:

  1. Su actividad (aquella en la que desea implementar la descarga del paquete de expansión cuando la descarga no se ha realizado automáticamente) implementa IDownloaderClient.

  2. Usted fija el servicio y el receptor y los fija en su manifiesto.

  3. El BASE64_PUBLIC_KEY en la clase de servicio es correcto. Suba el primer apk => busque en Servicios y API en la consola del programador bajo su app => Código de licencia para esta aplicación.

Este código se usa para ver si el archivo de expansión se puede encontrar en el dispositivo:

 boolean expansionFilesDelivered() { for (XAPKFile xf : xAPKS) { String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion); Log.i(TAG, "Expansion filename " +fileName); if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false)) return false; } return true; } 

Utiliza la clase XAPKS que representa un archivo de expansión, ya sea un archivo principal o de parche, con un cierto tamaño de archivo (bytes) y asociado con una versión de apk (la que se agregó por primera vez).

 private static class XAPKFile { public final boolean mIsMain; // true public final int mFileVersion; //example 4 public final long mFileSize; //example 126515695L // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size XAPKFile(boolean isMain, int fileVersion, long fileSize) { mIsMain = isMain; mFileVersion = fileVersion; mFileSize = fileSize; } } 

También es muy fácil de leer archivos de películas y otras cosas directamente desde el archivo de expansión utilizando las herramientas de zip que google ha proporcionado (com.android.vending.zipfile).

Primero obtenga el archivo de expansión usando los métodos proporcionados en la biblioteca, los parámetros son enteros que representan la versión principal de apk de expansión (la versión apk donde primero se agregó el paquete de expansión que necesitas) y la versión de apk del parche.

 ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK); 

Vídeo

Para reproducir vídeo directamente desde este archivo zipresource:

 AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip); 

Ahora de este assetFileDescriptor puedes obtener un FileDescriptor y usarlo en tu mediaplayer, la sintaxis correcta para que tu reproductor multimedia pueda reproducir el video también necesita el segundo y tercer parámetro. Sea el startoffset y la longitud que puedes obtener del AssetFileDescriptor.

 player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength()); 

Otro

Para todas las otras cosas (como imágenes) sólo puede obtener un inputtream del archivo zipresource:

 expansionFile.getInputStream(pathToFileInsideZip);` 

TAMBIÉN asegúrese de no comprimir los videos en la cremallera para que esto funcione! Por ejemplo no comprimir archivos .mp4:

 zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*" 

Solo quiero agregar algunas cosas que aprendí en el proceso de implementación de esto:

1) A partir de ahora, no es necesario implementar la biblioteca de descarga y todas las cosas de XAPKFile, todo lo que necesita hacer es copiar / pegar todos los permisos que aparecen en https://developer.android.com/google/play /expansion-files.html en su archivo de manifiesto. Tal vez lo hicieras, pero Google Play Store gestiona la descarga y la instalación para ti. La única razón por la que necesitaría manejar la descarga real en su código fuente es si el usuario entró manualmente en Android / obb y eliminó los archivos de expansión.

2) Al cargar su archivo .zip, no tiene que nombrarlo a la convención main.version.package.obb. Simplemente cargue su archivo .zip con su nombre original, y será renombrado para usted sin importar.

3) Para acceder al archivo zip, vaya a Archivo> Nuevo> Módulo de importación e importe la biblioteca zip_file que está en el mismo directorio que el descargador y las bibliotecas de licencias. Asegúrese de agregar a sus dependencias en el archivo build.gradle para su aplicación: compile project (': zip_file'). Esto hace que usted pueda importar esas bibliotecas en su proyecto.

Espero que sea de ayuda. Básicamente pasé horas tratando de implementar el código (complicado) de la biblioteca de descarga que aparece en el sitio, y al final lo eliminé todo y sólo guardé los permisos en el manifiesto, y funciona bien.

En Eclipse su proyecto, haga clic con el botón derecho del ratón, siga los pasos: Herramientas de Android-> Exportar paquete de aplicaciones firmado -> ….

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