web-dev-qa-db-fra.com

comment référencer un actif dans un projet de bibliothèque

Dans une classe appartenant à un Library project, j'appelle:

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

Malheureusement, cela ne fonctionne que si je duplique le fichier info.html dans le dossier Application) du projet.

Existe-t-il un moyen de dire à un code de bibliothèque Android: "recherchez ce fichier dans le dossier des actifs de la bibliothèque, pas dans le dossier des actifs de l'application"?

51
an00b

Depuis le Android Docs :

Les projets de bibliothèque ne peuvent pas inclure d'actifs bruts

Les outils ne prennent pas en charge l'utilisation de fichiers d'actif bruts (enregistrés dans le répertoire assets /) dans un projet de bibliothèque. Toute ressource d'actif utilisée par une application doit être stockée dans le répertoire assets/du projet d'application lui-même. Cependant, les fichiers de ressources enregistrés dans le répertoire res/sont pris en charge.

Si vous souhaitez inclure des fichiers d'un projet de bibliothèque, vous devez le placer dans les ressources plutôt que dans les ressources. Si vous essayez de charger des fichiers HTML de votre projet de bibliothèque dans une vue Web, vous devrez utiliser une méthode plus détournée que l'URL habituelle de l'actif. Au lieu de cela, vous devrez lire les données de la ressource et utiliser quelque chose comme _ { loadData } _. 

Cette réponse est obsolète , le système de construction gradé et les fichiers AAR prennent en charge les actifs.

79
kabuko

Ceci est maintenant possible en utilisant le système de compilation Gradle.

En testant avec Android Studio 0.5.0 et v0.9 du plugin Android Gradle, j'ai constaté que des fichiers tels que 

MyLibProject/src/main/assets/test.html

sont correctement empaquetés dans l'application finale et sont accessibles au moment de l'exécution via l'URL attendue:

file:///Android_asset/test.html
19
Graham Borland

D'accord. J'ai été stressé et j'ai perdu le sommeil pendant un moment. Je suis le type de personne qui aime la création d’API et qui complique l’intégration HATES.

Il n’existe pas beaucoup de solutions sur Internet, je suis donc très fier de ce que j’ai découvert avec un peu d’Eclipse Hackery.

Il s'avère que lorsque vous placez un fichier dans le dossier/assets d'Android Lib. La cible apk va capturer cela et la placer à la racine de l'archive APK. Ainsi, en faisant en sorte que l'accès général échoue . Ceci peut être résolu simplement en créant une bibliothèque Java brute et en y plaçant tous les actifs, c.-à-d.

Vous pouvez ensuite l'inclure en tant que source du dossier du chemin de construction Java dans Projet> Propriétés> Chemin de construction Java> Source> Lier la source.

  1. Source de lien
  2. Cliquez sur Variables. et Ajouter une nouvelle variable, c’est-à-dire VAR_NAME_X. location: ../../(relative_path_to_assets_project)
  3. Cliquez sur OK

Désormais, lorsque vous construisez et exécutez votre application, le dossier des ressources de l'APK contiendra les fichiers (GLOBAL Library) que vous souhaitez.

Pas besoin de reconfigurer les internes d'Android ou rien. Tout est capable en quelques clics d’Eclipse.

12
Daniel Grant

Vous pouvez y parvenir en créant un lien symbolique dans le dossier des ressources du projet qui pointe vers le répertoire du projet de bibliothèque.

Ensuite, vous pouvez accéder comme ci-dessous:

webview.loadUrl("file:///Android_asset/folder_in_a_libary_project/info.html", null);
11
Yuichi Kikuchi

Je confirme que l'approche de Daniel Grant fonctionne au moins pour la situation suivante: le projet cible N'A PAS de dossier de ressource (ou le dossier est vide, vous pouvez donc le supprimer en toute sécurité). Je n'ai configuré aucune variable . Configurez simplement un LinkSource comme suit (juste un exemple) Emplacement du dossier lié: /home/matthew/workspace_moonblink/assetsForAdvocacy/assets Nom du dossier: assets

"AssetsForAdvocacy" est un projet Java (créé avec New Project - Java Project) avec un dossier src vide et un nouveau dossier nommé "assets", qui fournit désormais l'intégralité du dossier assets du projet cible. 

C'est un moyen assez simple au sein d'Eclipse de permettre la réutilisation des actifs dans de nombreux projets différents SI ils ne possèdent pas déjà des actifs, ils sont assez bons pour commencer. Je souhaiterais probablement l’améliorer pour devenir un fournisseur de contenu à long terme, mais c’est beaucoup plus de développement. 

Mon projet accède aux ressources avec le code suivant: String advocacyFolderInAssets = "no_smoking /"; // un dossier sous assets / String fn = advocacyFolderInAssets + imageFilename; Bitmap pristineBitmapForAdvocacy = getBitmapFromAsset (context, fn);

J'utilise Motodev Studio 3.1.0 sur Ubuntu. Cela ne me laisserait pas «fusionner» un nouveau dossier d'actifs du nouveau projet d'actifs uniquement sur un dossier d'actifs existant dans le projet cible.

4
mbarton888

Si vous souhaitez utiliser une configuration dans laquelle plusieurs produits dérivés sont créés à partir d'une bibliothèque, vous pouvez envisager d'utiliser svn: externals ou une solution similaire dans votre système SCM. Cela fera également l'astuce voulant que les ressources statiques telles que l'aide en ligne puissent être versionnées séparément du code source Android.

1
FINARX

J'ai trouvé cette question plus ancienne , cela pourrait aussi vous aider.

C’est la méthode officielle utilisée par Google pour archiver cela (extrait du message ci-dessus): Link

0
Lukas Knuth