Archivo de expansión descargado pero no disponible

Así que he copiado la muestra de paquete de expansión para Android y lo he hecho funcionar sobre la base de la guía proporcionada por google . He hecho con éxito que funcione almacenando un archivo .obb local, pero no puedo conseguir hacerlo funcionar con la descarga del archivo .obb. El estado se cambia a IDownloaderClient.STATE_COMPLETED pero no se encuentra ningún archivo.

Pasos por los que he pasado:

  1. Realizar la ejecución de la muestra (actualizada con BASE64_PUBLIC_KEY , new package name , version number )
  2. Prueba correctamente con el archivo local .obb.
  3. Hacer apk y subir a jugar junto con el archivo de expansión.
  4. Instalar apk firmado y ejecutar la aplicación. <- aquí dice que la descarga fue un éxito, pero sin dar ninguna actualización de progreso durante el proceso de descarga.

Por favor, ayude a obtener el archivo de expansión descargado.

Editar: En el paso 4 ahora obtiene la descarga falló porque los recursos no se pudo encontrar.

Editar 2: Así que después de depurar veo que el estado cambia a ninguna descarga necesaria, pero no se puede validar el archivo como está ausente. Así que por alguna razón cree que el archivo se ha descargado.

Edit 3: Así que dentro de DownloaderService.class tenemos un método run () que hace un getExpansionURLCount() que devuelve 0. La documentación dice: this will return zero if there has been no LVL fetch in the current session . Después de más cavar veo que la respuesta que recibo de Google en processServerResponse() tiene el código de respuesta 256 y ninguna llave con FILE_URL . Entonces, ¿cuál es la causa de esto?

Sé que esta respuesta no aborda el problema subyacente, pero pensé que esta explicación podría ayudar a otros como yo que han sido confundidos por las respuestas de la biblioteca descargadora:

El servicio de descargador pasará STATE_COMPLETED a onDownloadStateChanged() poco intuitiva cuando el servidor de licencias de Google le informe que no hay archivos de expansión asociados con la aplicación. Dado que tiene que hacer una llamada asíncrona al servidor para averiguarlo, no puede devolver NO_DOWNLOAD_REQUIRED directamente desde startDownloadServiceIfRequired() . Tiene que iniciar el servicio para consultar el servidor.

Pero parece que sólo lo hará la primera vez que llame al servicio de descarga después de que su aplicación esté instalada. Después de eso, almacena en caché la respuesta del servidor de licencias en una base de datos local y las llamadas futuras a startDownloadServiceIfRequired() devolverán inmediatamente NO_DOWNLOAD_REQUIRED .

El código de respuesta 256 corresponde a Policy.LICENSED , lo que significa que el nombre del paquete y la clave pública son válidos, pero la falta de FILE_URL sugiere que Google Play piensa que no hay ningún archivo de expansión para la aplicación.

En mi caso, mi archivo de expansión funcionó cuando la aplicación estaba en borrador, pero una vez publicado, efectivamente desapareció de la tienda. No he sido capaz de determinar por qué.

Es probablemente porque el archivo se encontró "incompleto" al hacer los controles después de la finalización, y luego se eliminó.

Una posibilidad es que la longitud del archivo descargado sea diferente a la que proporcionaste a android.vending/expansion/downloader.Helpers.deosFileExist(Context, String, long, boolean) , así que comprueba primero que el valor proporcionado coincida con el valor real.

Si esto no resuelve el problema, considere agregar punto de interrupción a todas las llamadas de eliminación de archivos y ver si alguna de ellas se dispara.

Después de unos días de búsqueda por una solución, encontré el error para mi caso.

Utilizando LicenseChecker, vi la devolución de llamada del oyente una aplicaciónError con el código 3. Aquí código:

  aep = new APKExpansionPolicy(this, new AESObfuscator(ContentDownloaderService.SALT, getPackageName(), deviceId)); aep.resetPolicy(); checker = new LicenseChecker(this, aep, BASE64_PUBLIC_KEY // Your public licensing key. ); checker.checkAccess(new LicenseCheckerCallback() { @Override public void allow(int reason) { System.out.println("Allow Reason "+reason); } @Override public void dontAllow(int reason) { System.out.println("Don't Allow Reason "+reason); try { switch (reason) { case Policy.NOT_LICENSED: System.out.println("Not licensed"); break; case Policy.RETRY: System.out.println("Retry"); break; } } finally { } } @Override public void applicationError(int errorCode) { System.out.println("aplication error "+errorCode); } }); 

El código de error 3 es ERROR_NOT_MARKET_MANAGED, puede ver la lista completa de errores aquí https://developer.android.com/google/play/licensing/licensing-reference.html#server-response-codes , y aquí puedo obtener información sobre eso Error mean ¿Cómo lidiar con LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED código de error?

Resumen, que sucedió porque mi versión local no es la misma versión en la consola de google, y me pasó porque mi versionCode es generado por un script como este:

 def getBuildVersionCode() { def date = new Date() def formattedDate = date.format('yyMMddHHmm') return (formattedDate as int) + 221066279; } def getBuildVersionName() { return getBuildVersionCode().toString(); } android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.test.testing" minSdkVersion 15 targetSdkVersion 21 versionCode getBuildVersionCode() versionName getBuildVersionName() } 

Así que cada vez que compilar estoy recibiendo una nueva versión y obviamente esa versión no está en la consola de google.

He cambiado mi script gradle a:

  android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.test.testing" minSdkVersion 15 targetSdkVersion 21 versionCode 1731227595 // My actual version number of apk in google developer console. versionName 1731227595 } 

Y que me salvó la vida, espero que esta respuesta pueda ser útil para cualquiera más ..

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