2011-06-14 11 views
50

En una clase de pertenencia a un proyectoBiblioteca llamo:cómo hacer referencia a un activo en un proyecto de biblioteca

webview.loadUrl("file:///android_asset/info.html", null); 

Por desgracia, esto sólo funciona si duplicar la info.html archivo en el La carpeta de activos del proyecto de la aplicación también.

¿Hay alguna manera de decir un código de biblioteca de Android: "busque este archivo en la carpeta de activos de la biblioteca, no en la carpeta de activos de la aplicación"?

+0

Tres años más tarde, esto es finalmente posible. Ver mi respuesta: http://stackoverflow.com/a/22254488/385478 –

Respuesta

77

Desde el Android Docs:

proyectos de bibliotecas no pueden incluir activos primas

Las herramientas no admite el uso de archivos de activos brutos (guardados en el directorio assets /) en un proyecto de biblioteca. Todos los recursos de activos utilizados por una aplicación deben almacenarse en el directorio assets/del proyecto de la aplicación. Sin embargo, los archivos de recursos guardados en el directorio res/son compatibles.

Si desea incluir archivos de un proyecto de biblioteca, deberá ponerlos en los recursos en lugar de los activos. Si intenta cargar archivos HTML desde su proyecto de biblioteca en un WebView, esto significa que tendrá que ir a un método más indirecto que el URL del activo habitual. En su lugar, tendrá que leer los datos del recurso y usar algo como loadData.

Esta respuesta es out of date, gradle build system y los archivos AAR admiten activos.

+0

El problema con loadData es que las imágenes y otros elementos de página a los que se hace referencia en el html cargado no se pueden cargar sin una gran cantidad de piratería. –

+1

@kabuko La explicación de Google no está clara para mí. Tengo un proyecto que tiene una dependencia de biblioteca. Tengo un archivo de recursos de ruta/dir/index.html, js, css en este proyecto de biblioteca y este se está cargando desde mi aplicación. Estoy usando IntelliJ y hay una opción para decirle al compilador "Incluir activos de dependencias en APK". Mientras compila, fusiona ambos activos. Esta es una práctica común que hacen los desarrolladores. Asegúrese de tener nombres de directorios y archivos distintos que no entren en conflicto con los archivos de la aplicación. – Nizzy

+1

@Nizzy Es completamente posible que esta sea una característica incluida en IntelliJ. No uso IntelliJ o Android Studio regularmente, así que no puedo decir mucho sobre ese tema. Estaba hablando puramente por experiencia (hace 2.5 años para arrancar) usando Eclipse y Ant, así como también anoté la documentación de Google. Me imagino que IntelliJ está haciendo exactamente lo que OP describió: copiando los archivos, aunque solo en el proceso de compilación. – kabuko

0

Encontré this older question, podría ayudarle también.

Ésta es la manera oficial de Google utiliza para archivar la presente (desde el post anterior): Link

+0

Gracias. Desafortunadamente, ese hilo no explica ** cómo ** hacer referencia a un activo en un proyecto de biblioteca. – an00b

+0

Sí, lo hace ... incluso con imágenes: [Enlace] (http://developer.android.com/guide/developing/projects/projects-eclipse.html) –

+1

No, no es así. Solo cómo hacer referencia a un proyecto de biblioteca, no a un activo en el proyecto de biblioteca. – dvallejo

11

Bien. He estado estresado y perdiendo el sueño sobre esto por un tiempo. Soy el tipo de persona que adora la creación de API y ODIO la integración complicada.

No hay muchas soluciones en Internet, así que estoy bastante orgulloso de lo que he descubierto con un poco de Eclipse Hackery.

Resulta que cuando pones un archivo en la carpeta Android lib/assets. La aplicación de destino capturará esto y lo colocará en la raíz del archivo APK. Por lo tanto, hacer que el acceso general falle. Esto puede resolverse simplemente creando una biblioteca Java sin procesar y colocando todos los activos allí, es decir (JAVALIB) /assets/fileX.txt.

A su vez, puede incluir esto como Origen de la carpeta de la ruta de compilación de Java en Proyecto> Propiedades> Ruta de compilación de Java> Origen> Origen de enlace.

  1. Enlace Fuente
  2. Haga clic en Variables. y Agregar nueva variable, es decir, VAR_NAME_X. ubicación : ../../ (Relative_path_to_assets_project)
  3. Haga clic en Aceptar

Ahora, cuando se genera y ejecuta la aplicación, la carpeta de activos en el APK contendrá sus archivos (biblioteca universal) como se pretendía.

No hay necesidad de reconfigurar la parte interna de Android o nada. Es todo capaz con unos pocos clics de Eclipse.

+0

+1 para una gran solución, pero ¿qué quiere decir con "una biblioteca Raw de Java"? ¿Cómo se crea uno en Eclipse? ¡Gracias! – an00b

+0

Debe escribir una prueba de concepto. No estoy seguro de si esto realmente funciona de la manera en que alguien familiarizado con los recursos en un proyecto de Android lo esperaría. Por ejemplo, ¿se puede hacer referencia a los activos resultantes con la url "file: /// android_asset"? –

+0

Esto funcionó para mí, @TomDignan, así que publiqué un [proyecto de muestra] (https://github.com/donkirkby/webandnative/blob/assets/android/.project#L33) que usa un recurso vinculado para su carpeta de activos . –

4

Confirmo que el enfoque de Daniel Grant funciona al menos para la siguiente situación: el proyecto de destino NO tiene una carpeta de activos (o la carpeta está vacía, por lo que puede eliminarla con seguridad). No configuré ninguna variable. Simplemente configurar un LinkSource de la siguiente manera (es un ejemplo) ubicación de la carpeta Vinculado:/home/Mateo/workspace_moonblink/assetsForAdvocacy/activos Nombre de la carpeta: activos

El "assetsForAdvocacy" es un proyecto Java, (creado con el Nuevo- Proyecto - Proyecto Java) con una carpeta src vacía, y una nueva carpeta llamada "activos", que ahora proporciona la carpeta de activos completa para el proyecto de destino.

Esta es una manera bastante directa dentro de Eclipse de proporcionar reutilización de activos en muchos proyectos diferentes SI todavía no tienen activos, lo suficientemente buenos como para seguir adelante. Probablemente quiera mejorarlo para convertirme en un proveedor de contenido a largo plazo, pero eso es mucho más desarrollo.

Mi proyecto accede a los activos con el siguiente código: String advocacyFolderInAssets = "no_smoking /"; // una carpeta debajo de assets/ String fn = advocacyFolderInAssets + imageFilename; Bitmap pristineBitmapForAdvocacy = getBitmapFromAsset (context, fn);

Uso Motodev Studio 3.1.0 en Ubuntu. No me permitiría 'fusionar' una nueva carpeta de activos en el nuevo proyecto de activos solo en una carpeta de activos existente en el proyecto de destino.

11

Puede lograrlo creando un enlace simbólico en la carpeta de activos del proyecto que apunta al directorio en el proyecto de la biblioteca.

A continuación, puede acceder de la siguiente manera:

webview.loadUrl("file:///android_asset/folder_in_a_libary_project/info.html", null); 
+0

¡Esta es la respuesta más útil aquí! – pstoppani

+0

+1 para una respuesta real: D en eclipse, simplemente arrastre la carpeta de activos desde el explorador/buscador/lo que sea al proyecto y elija vincularlo ... forma más rápida de hacerlo – Jimmar

1

Si desea utilizar una configuración en múltiples productos derivados se crean de una biblioteca que podría considerar el uso de svn: externos o solución similar en su sistema SCM. Esto también hará que los activos estáticos como la ayuda en línea se puedan versionar por separado desde el código fuente de Android.

16

Esto ahora es posible usando el sistema de compilación Gradle.

de pruebas con Android 0.5.0 Estudio y v0.9 del plugin Android Gradle, me he dado cuenta que los archivos tales como

MyLibProject/src/main/assets/test.html 

se empaquetan correctamente en la aplicación final y se puede acceder en tiempo de ejecución a través de la URL esperada:

file:///android_asset/test.html 
+0

Está colocando una carpeta llamada activos en el directorio src, que no es estándar. Las carpetas de activos van en la raíz del módulo de eclipse project/intellij –

+5

@StealthRabbi Wrong. Consulte http://stackoverflow.com/questions/18302603/where-to-place-assets-folder-in-android-studio –

+1

Simple y funciona –

Cuestiones relacionadas