2010-03-16 20 views
6

Recibo muchas solicitudes en mi aplicación para permitir paquetes de iconos personalizados de BetterCut/Open Home. La forma en que parece funcionar es instalar BetterCut o Open Home, luego puede instalar toneladas de estos paquetes de iconos gratuitos del mercado. Una vez instaladas, ambas aplicaciones (y otras aplicaciones) sondearán los paquetes de iconos y usarán los íconos.¿Acceso a los análisis de otra aplicación?

Quiero saber cómo sondear las aplicaciones de instalación para las carpetas de activos que están disponibles. Abrí algunos de los paquetes de iconos y verifiqué que hay una carpeta de activos allí y están llenos de todos los archivos png de iconos.

He buscado aquí, otros sitios de código, google, etc. pero no he encontrado ninguna pista.

ACTUALIZACIÓN:

A partir de la respuesta a continuación he escrito algo de código para tratar de enumerar un archivo de mi propio directorio activos proyectos pero no parece funcionar.

Resources r = this.getResources(); 
AssetManager a = r.getAssets(); 
String[] list = a.list("/"); 
Log.d("test", "Length of/is "+list.length); 
for (String s : list) { 
    Log.d("test", s); 
} 

Log.d("test", "Length of /assets is "+a.list("/assets").length); 
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length); 
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length); 
Log.d("test", "Length of ./assets/ is "+a.list("./assets/").length); 
Log.d("test", "Length of ./assets is "+a.list("./assets").length); 

Ésta es la salida:

03-16 12:25:04.591: DEBUG/test(13526): Length of/is 6 
03-16 12:25:04.591: DEBUG/test(13526): AndroidManifest.xml 
03-16 12:25:04.591: DEBUG/test(13526): META-INF 
03-16 12:25:04.591: DEBUG/test(13526): assets 
03-16 12:25:04.591: DEBUG/test(13526): classes.dex 
03-16 12:25:04.591: DEBUG/test(13526): res 
03-16 12:25:04.591: DEBUG/test(13526): resources.arsc 
03-16 12:25:04.614: DEBUG/test(13526): Length of /assets is 0 
03-16 12:25:04.637: DEBUG/test(13526): Length of /assets/ is 0 
03-16 12:25:04.661: DEBUG/test(13526): Length of /assets/ is 0 
03-16 12:25:04.692: DEBUG/test(13526): Length of ./assets/ is 0 
03-16 12:25:04.716: DEBUG/test(13526): Length of ./assets is 0 

ACTUALIZACIÓN 2 99% !!! No:

me di cuenta de que se puede leer desde el directorio de activos sin tener que usar el nombre de la carpeta:

InputStream is = assetManager.open("test.png"); 

También probé esto con un recurso en Appliction 2 desde la Aplicación 1, donde la ruta de la carpeta es/a sset/icono/image.png:

InputStream is = assetManager.open("icon/image.png"); 

siguiente me di cuenta de que se puede enumerar un directorio dentro activos:

String[] list = assetManager.list("icons"); 

Eso también funciona muy bien. Lo único que falla en este momento es cómo enumerar los activos del directorio base.

Respuesta

4

Para obtener la carpeta de base /assets es necesario utilizar el AssetsManager para listar el directorio con sólo cita:

AssetManager am = this.getAssets(); 
String[] names = am.list(""); 

Habrá algunos archivos adicionales que se indican: imágenes, sonidos, WebKit, tal vez otros. Puede ignorar estos directorios, son parte del directorio de activos de marcos. Esta es una cita de groups.google.com:

la actualidad, el gestor de activos fusiona el directorio activo del marco recursos junto con sus propios archivos colocados en "activos". Debemos probablemente cambiar este comportamiento (que era parte de una /localización modelo de recursos de edad ), pero no hace mucho daño excepto que se ven más archivos/directorios en sus propios activos lo que cabría esperar. Cualquiera de sus archivos que son los mismos que uno en los activos de estructura se utilizará en su lugar, cuando se accede a través de su AssetManager.

También puede enumerar una subcarpeta dentro del directorio activo y no es necesario ningún barras:

String[] names= am.list("subfolder"); 

Tenga en cuenta que no he incluido "/assets" en el nombre de archivo. Por último, una vez que tenga su lista de archivos que se pueden cargar en como:

InputStream in = am.open("file.png"); 

que cargará en un archivo en la carpeta de activos de base. O puede cargar un archivo en una subcarpeta de esta manera:

InputStream in = am.open("subfolder/file.png"); 

Si necesita cargar los archivos PNG en un mapa de bits también se puede hacer lo siguiente:

Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
+1

Esto parece hacer el truco, ¡gracias! También es gracioso que la cita sobre los activos del marco que se fusiona con la carpeta de activos sea realizada por un empleado de Google, Hackbod, que es la misma persona que no proporcionó la respuesta aquí. – pcm2a

3

El objeto Resources le da acceso a los activos. PackageManager puede darle acceso al Resources para una aplicación.

+0

que pensé que debería gatear antes de caminar y agregué un archivo a la carpeta de activos de mi proyecto y ahora estoy tratando de enumerarlo usando el AssetManager, pero parece que no se usa cuando intento listar el directorio de activos. Actualizaré la publicación original con el código que estoy intentando. – pcm2a

+1

Ver http://stackoverflow.com/questions/1495585/how-can-i-get-a-directory-listing-of-resources-from-my-android-app – CommonsWare

+0

Intenté utilizar el método exacto de "personas visibles" de esa persona y ponga una impresión para ver la longitud de la lista, que sigue siendo cero para todas las pruebas, excepto para la carpeta raíz "/". Nunca consigo una lista de los archivos en "/ assets" para poder enumerarlos. También intenté ir directamente a un archivo en mi carpeta de activos con: InputStream is = a.open ("/ assets/test.png"); Eso arroja una excepción de archivo no encontrado. – pcm2a

2

Probablemente debería obtener una visión general básica de cómo funcionan los recursos y activos antes de profundizar en las cosas. :)

En primer lugar, una .apk es solo un archivo zip, por lo que todo lo que desea hacer es excavar su contenido puede poner ese archivo en su computadora host y utilizar todas las herramientas zip normales para verlo .

En segundo lugar, hay dos tipos principales de archivos proporcionados por el usuario en .apk: activos sin procesar y recursos estructurados.

El anterior es sólo una jerarquía arbitraria de archivos que pueden ser recuperados con http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)

Este último son procesados ​​por las herramientas integradas en una tabla estructurada, lo que les permite variar según la configuración. Se accede a ellos usando Recursos y clases relacionadas. Los drawables, cadenas, colores y la mayoría de los otros tipos de datos que recupera de una .apk generalmente se almacenan como un recurso, no como un activo.

Puede usar la herramienta aapt para ver todos los recursos en un.apk: aapt dump resources

Por último, si desea leer los datos de estos .apks, ¿qué le parece mirar su información sobre cómo compilarlos? Eso debería proporcionarle mucha información básica que necesita sobre cómo están estructurados.

+0

No necesito acceder al archivo en mi computadora. Necesito acceder al directorio de activos en la aplicación 2 desde la aplicación 1 en el teléfono mismo. Recibo una gran cantidad de solicitudes para agregar soporte para los paquetes de íconos BetterCut gratuitos en el mercado. Entonces desde mi aplicación quiero que el usuario pueda seleccionar los íconos desde allí (están almacenados en la carpeta de activos, lo busqué). La mayoría de las cosas que menciona no son realmente relevantes para el problema original. No necesito una guía para compilar un apk, extraer imágenes o usar Drawables u otros recursos dentro de mi propia aplicación desde la carpeta res. – pcm2a

Cuestiones relacionadas