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:
- ¿Dónde colocar el archivo OBB para probar los archivos de paquete de expansión de Android (OBB) en mi Nexus 4?
- Depuración de la aplicación de Android después del lanzamiento
- Cómo agregar archivos de expansión de Android con Qt
- Cómo crear archivos OBB USANDO la herramienta jobb Android
- Leer el contenido del archivo de expansión APK (del archivo obb)
- Realizar la ejecución de la muestra (actualizada con
BASE64_PUBLIC_KEY
,new package name
,version number
) - Prueba correctamente con el archivo local .obb.
- Hacer apk y subir a jugar junto con el archivo de expansión.
- 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?
- Pasos para crear un archivo de expansión APK
- No se puede montar el archivo .obb (estado = 21) en la nota de Meizu m3
- GetFileDescriptor devuelve null mientras lee archivos mp3 de los archivos de expansión
- Actualizar la aplicación android con el archivo de expansión en Play Store
- Google Play: cómo evitar la descarga del gran archivo de expansión APK cuando el usuario instala la APP desde el mercado
- ¿Cómo montar archivos de expansión APK cifrados?
- Deshabilitar la descarga automática de archivos de expansión APK
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 ..