2011-03-31 17 views
7

Estoy descargando un archivo apk de la web y guardándolo en Context.getCacheDir(). Estoy descargando archivos por HttpURLConnection - No estoy preguntando en realidad sobre el código (está funcionando completamente), así que no lo estoy publicando aquí. Inicia exitosamente la descarga. El archivo se descarga en la memoria caché y luego se solicita su instalación, pero el sistema no puede abrir mi APK y escribe el error de análisis.Android: no se pudo abrir el archivo zip

De ahí problema es el siguiente:

03-31 16:48:43.740: INFO/ActivityManager(59): Start proc com.android.packageinstaller for activity com.android.packageinstaller/.PackageInstallerActivity: pid=620 uid=10026 gids={} 
03-31 16:48:44.749: WARN/zipro(620): Unable to open zip '/data/data/com.my.app/cache/myApp.apk': Permission denied 
03-31 16:48:44.749: DEBUG/asset(620): failed to open Zip archive '/data/data/com.my.app/cache/myApp.apk' 
03-31 16:48:44.930: WARN/PackageParser(620): Unable to read AndroidManifest.xml of /data/data/com.my.app/cache/myApp.apk 
03-31 16:48:44.930: WARN/PackageParser(620): java.io.FileNotFoundException: AndroidManifest.xml 

El problema es - no tengo permiso para acceder a programaticaly/cache. ¿Hay alguna forma de cómo resolverlo? No quiero utilizar el almacenamiento externo como directorio de descarga (el proceso de instalación funciona cuando descargo archivos en el almacenamiento externo), el caché es excelente porque el administrador no puede acceder al archivo desde el administrador general y eso es lo que quiero. Gracias por tus pensamientos

Este problema ha sido para mí sin solución para más de un mes ...

Editar: Aún no hay solución, estoy tratando de pensar que me encontré primera cosa, que no es posible con Android

Edit2: Debo haber estado mal - mi apk descargado está presente en caché ... ¿Todavía no hay permiso para permitir la instalación desde ese directorio?

+0

intenté utilizar el 'openFileOutput()' .... si no, inténtalo con 'MODE_WORLD_READABLE' – Panthro

+0

Hola, encontraste la solución al problema anterior. Estoy en una solución similar ahora. – CodeGuru

+0

He visto 'WORLD_WRITABLE' en casi todas las respuestas de este comentario. NO HAGA ** ** LO HAGA por otra cosa que no sea una prueba, que los permisos son el problema. – domen

Respuesta

1

veo lo que está pasando ..

El directorio caché es una memoria caché gestionado por Android, lo que significa que se puede limpiar tan pronto como la memoria interna comienza a agotarse.

Y si su aplicación ocupa demasiado espacio en un caché (lo que probablemente hace un APK) cuando la aplicación se detiene/suspende, Android puede limpiar su directorio de caché.

Para probarlo, este es el caso, haga todo lo que hizo y cuando comience el proceso de instalación solo abra el DDMS y vea si su archivo aún está en la caché.

De lo contrario, Android ha limpiado la caché de la aplicación porque ya no se está ejecutando.

Trate de usuario un enfoque diferente, en lugar de context.getCacheDir() tratar context.getFilesDir()

+0

Hola, en realidad estoy usando Context.getCacheDir() y no puedo ver la aplicación descargada en un caché en ADB ... parece que el sistema lo está eliminando justo después de la actualización ... – Waypoint

+0

Lo mismo para el contexto.getFilesDir() en cuanto a getCacheDir() - sin éxito – Waypoint

+0

ese es el problema ... ¿conoces el tamaño de la aplicación? parece que es demasiado grande para ser almacenado en un almacenamiento interno ...necesitarás almacenarlo en la tarjeta SD ... instalar ... luego eliminar. – Panthro

6

chmod 666 en el archivo APK descargado antes de instalarlo en su código

más detalle:

path = your_apk_file_path_in_cache_dir; 
permission="666"; 

try { 
    String command = "chmod " + permission + " " + path; 
    Runtime runtime = Runtime.getRuntime(); 
    runtime.exec(command); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Gracias .. Después de ejecutar ese comando, el instalador del paquete puede abrir archivo descargado – Blehi

+0

Yo usaría 'chmod 644' en su lugar, ya que es el conjunto de permisos para las aplicaciones'/system'. No estoy seguro de por qué querría un 'chmod 666' que permitiera a otros programas escribir permiso. También puede instalarlo y hacer esto a través de 'adb' y luego reiniciar. –

2

Este es puede ayudarlo:

FileOutputStream fOutputStream = context.openFileOutput(
    fileName, Context.MODE_WORLD_READABLE); 
Cuestiones relacionadas