53 votes

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

Dans une classe appartenant à un Bibliothèque projet que j'appelle :

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

Malheureusement, cela ne fonctionne que si je duplicate le fichier info.html dans le L'application le dossier d'actifs du projet.

Existe-t-il un moyen d'indiquer le code d'une bibliothèque Android : "cherchez ce fichier dans le dossier des actifs de la bibliothèque", no dans le dossier des actifs de l'application" ?

0 votes

Trois ans plus tard, c'est enfin possible. Voir ma réponse : stackoverflow.com/a/22254488/385478

81voto

kabuko Points 23166

Cette réponse est périmé le système de construction gradle et les fichiers AAR des moyens de soutien.


De la Docs Android :

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

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

Si vous voulez inclure des fichiers d'un projet de bibliothèque, vous devrez les placer dans les ressources au lieu des actifs. Si vous essayez de charger des fichiers HTML de votre projet de bibliothèque dans une WebView, cela signifie que vous devrez utiliser une méthode plus détournée que l'URL habituelle des ressources. Au lieu de cela, vous devrez lire les données de la ressource et utiliser quelque chose comme loadData .

0 votes

Le problème avec loadData est que les images et les autres éléments de la page référencés dans le html chargé ne peuvent pas être chargés sans beaucoup de manipulations.

1 votes

@kabuko L'explication de Google n'est pas claire pour moi. J'ai un projet qui a une dépendance de bibliothèque. J'ai un chemin assets/dir/index.html, des fichiers js, css dans ce projet de bibliothèque et cela se charge depuis mon application. J'utilise IntelliJ et il y a une option pour dire au compilateur d'"Inclure les actifs des dépendances dans l'APK". Lors de la compilation, il fusionne les deux ressources. C'est une pratique courante que les développeurs font. Assurez-vous que vous avez des noms de répertoire et de fichiers distincts qui n'entreront pas en conflit avec les fichiers de l'application.

1 votes

@Nizzy Il est tout à fait possible qu'il s'agisse d'une fonctionnalité incluse dans IntelliJ. Je n'utilise pas IntelliJ ou Android Studio régulièrement, donc je ne peux pas me prononcer sur ce point. Je parlais uniquement de mon expérience (il y a 2 ans et demi pour commencer) en utilisant Eclipse et Ant et en prenant note de la documentation de Google. J'imagine qu'IntelliJ fait exactement ce que le PO a décrit : copier les fichiers, mais seulement dans le processus de construction.

23voto

Graham Borland Points 27556

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

En testant avec Android Studio 0.5.0 et la version 0.9 du plugin Android Gradle, j'ai constaté que les fichiers tels que

MyLibProject/src/main/assets/test.html

sont correctement emballés dans l'application finale et peuvent être accédés au moment de l'exécution via l'URL attendue :

file:///android_asset/test.html

0 votes

Vous mettez un dossier appelé assets dans le répertoire src, ce qui n'est pas standard. Les dossiers d'actifs vont dans la racine du projet eclipse / module intellij.

5 votes

@StealthRabbi Faux. Voir stackoverflow.com/questions/18302603/

2 votes

Ce code ne fonctionne pas. J'ai obtenu l'exception "no such file" de url.openStream. URL url = new URL("file:///android_asset/test.html") ; BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())) ;

14voto

Yuichi Kikuchi Points 91

Vous pouvez y parvenir en créant un lien symbolique dans le dossier des actifs 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);

0 votes

C'est la réponse la plus utile ici !

0 votes

+1 pour une vraie réponse :D dans eclipse , il suffit de faire glisser le dossier des actifs de l'explorateur/du chercheur/de ce que vous voulez dans le projet et de choisir de le lier c'est la façon la plus rapide de le faire.

12voto

Daniel Grant Points 81

Ok, ça fait un moment que je stresse et que je perds le sommeil à cause de ça. Je suis le type de personne qui aime la création d'API et qui déteste l'intégration compliquée.

Il n'y a pas beaucoup de solutions sur Internet, donc je suis assez fier de ce que j'ai découvert avec un peu d'Eclipse Hackery.

Il s'avère que lorsque vous mettez un fichier dans le dossier /assets de la bibliothèque Android. L'apk cible va le capturer et le placer sur la racine de l'archive APK. Ainsi, l'accès général échoue. Cela peut être résolu en créant simplement une bibliothèque Java brute et en y plaçant tous les actifs, par exemple (JAVALIB)/assets/fileX.txt.

Vous pouvez ensuite l'inclure en tant que source du dossier du chemin d'accès à la construction de Java dans le fichier Projet > Propriétés > Java Build Path > Source > Link Source.

  1. Source des liens
  2. Cliquez sur Variables. et Ajouter une nouvelle variable, c'est-à-dire VAR_NAME_X. emplacement : ../../(relative_path_to_assets_project)
  3. Cliquez sur Ok

Désormais, lorsque vous construisez et exécutez votre application, le dossier assets de l'APK contiendra vos fichiers (GLOBAL Library) comme vous l'aviez prévu.

Pas besoin de reconfigurer les internes d'Android ou quoi que ce soit. Tout est possible en quelques clics dans Eclipse.

0 votes

+1 pour une excellente solution de contournement, mais qu'entendez-vous par "une bibliothèque Java brute" ? Comment en créer une sur Eclipse ? Merci !

0 votes

Vous devriez écrire une preuve de concept. Je doute que cela fonctionne réellement de la manière dont une personne familière avec les actifs dans un projet Android s'y attendrait. Par exemple, les ressources résultantes peuvent-elles être référencées avec l'url "file:///android_asset" ?

0 votes

Cela a fonctionné pour moi, @TomDignan, donc j'ai posté une exemple de projet qui utilise une ressource liée pour son dossier de ressources.

4voto

mbarton888 Points 41

Je confirme que l'approche de Daniel Grant fonctionne au moins pour la situation suivante : le projet cible n'a PAS de dossier d'actifs (ou le dossier est vide, vous pouvez donc le supprimer sans risque). Je n'ai pas configuré de variable. Il suffit de configurer un LinkSource comme suit (juste un exemple) Emplacement du dossier lié : /home/matthew/workspace_moonblink/assetsForAdvocacy/assets Nom du dossier : assets

Le "assetsForAdvocacy" est un projet Java, (créé avec New- Project - Java Project) avec un dossier src vide, et un nouveau dossier nommé "assets", qui fournit maintenant le dossier complet des actifs pour le projet cible.

Il s'agit d'un moyen assez simple, au sein d'Eclipse, de permettre la réutilisation des actifs dans de nombreux projets différents, s'ils ne disposent pas déjà d'actifs, ce qui est suffisant pour commencer. J'aimerais probablement l'améliorer pour en faire un fournisseur de contenu à long terme, mais cela demande beaucoup plus de développement.

Mon projet accède aux actifs 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. Il ne m'a pas permis de "fusionner" un nouveau dossier de ressources dans le nouveau projet de ressources uniquement sur un dossier de ressources existant dans le projet cible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X