Acceder a Assests desde otra aplicación?

Tengo muchas peticiones en mi aplicación para permitir paquetes de iconos personalizados de BetterCut / Open Home. La forma en que parece que funciona es que instalar BetterCut o Open Home, entonces usted puede instalar toneladas de estos paquetes de iconos gratis del mercado. Una vez instaladas, ambas aplicaciones (y otras aplicaciones) buscarán esos iconos y utilizarán los iconos.

Quiero saber cómo encuestar las aplicaciones de instalación de las carpetas de activos que están disponibles. He abierto algunos de los paquetes de iconos y verificado que hay una carpeta de activos en allí y están llenos de todos los archivos icono png.

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

ACTUALIZAR:

De la respuesta abajo he escrito un cierto código para intentar y lista un archivo de mi propio directorio de los activos de los proyectos pero no parece trabajar.

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); 

Esta 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% Hay !!!:

Me imaginé que se puede leer en el directorio de activos sin utilizar el nombre de la carpeta:

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

También intenté esto con un activo en la Aplicación 2 de la Aplicación 1, donde la ruta de la carpeta es /asset/icon/image.png:

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

A continuación me di cuenta de que puede enumerar un directorio dentro de los activos:

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

Eso también funciona muy bien. Lo único que falla ahora es cómo listar los activos del directorio base.

Para obtener la carpeta de base /assets , debe utilizar AssetsManager para listar el directorio con solo comillas:

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

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

En la actualidad, el administrador de activos fusiona el directorio de activos de los recursos del marco junto con sus propios archivos colocados en "activos". Probablemente deberíamos cambiar este comportamiento (era parte de un antiguo recurso / modelo de localización), pero no hace mucho daño, excepto que usted ve más archivos / directorios en sus propios activos de lo que cabría esperar. En su lugar, se utilizará cualquiera de los archivos que sean iguales a uno en los recursos del marco, cuando se acceda a través de su AssetManager.

También puede enumerar una subcarpeta dentro del directorio de activos y no necesita barras:

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

Tenga en cuenta que no incluí "/assets" en el nombre de archivo. Por último, una vez que tenga su lista de archivos que puede cargar en como:

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

Que se carga en un archivo en la carpeta de activos básicos. O puede cargar un archivo en una subcarpeta como esta:

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

Si necesita cargar esos pngs en un mapa de bits también puede hacer lo siguiente:

 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 

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

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

En primer lugar, un .apk es sólo un archivo zip, por lo que todo lo que desea hacer es cavar a través de su contenido puede poner ese archivo en su computadora host y utilizar todas las herramientas de zip normal para mirarlo.

En segundo lugar, hay dos tipos principales de archivos suministrados por el usuario en un archivo .apk: recursos en bruto y recursos estructurados.

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

Los últimos son procesados ​​por las herramientas construidas en una tabla estructurada, permitiéndoles variar por configuración. Se accede mediante Recursos y clases relacionadas. Los dibujos, las cadenas, los colores y la mayoría de los otros tipos de datos que se recuperan de un archivo .apk normalmente se almacenan como un recurso y no como un recurso.

Puede utilizar 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é hay de mirar su información sobre cómo construirlos? Eso debe darle una gran cantidad de información muy básica que usted necesita en cómo se estructuran.

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