wake-up-neo.com

so referenzieren Sie ein Asset in einem Bibliotheksprojekt

In einer Klasse, die zu einem Library -Projekt gehört, nenne ich:

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

Leider funktioniert das nur, wenn ich duplicate die Datei info.html in den Projektordner von Application kopiere.

Gibt es eine Möglichkeit, einem Android-Bibliothekscode mitzuteilen: "Diese Datei im Ordner Assets der Bibliothek suchen, nicht im Ordner Assets der Anwendung"?

51
an00b

Aus den Android-Dokumenten :

Bibliotheksprojekte können keine Rohdaten enthalten

Die Tools unterstützen nicht die Verwendung von Roh-Asset-Dateien (in dem Assets/Verzeichnis gespeichert) in einem Bibliotheksprojekt. Alle von einer Anwendung verwendeten Asset-Ressourcen müssen im Assets/Verzeichnis des Anwendungsprojekts selbst gespeichert werden. Ressourcendateien, die im Verzeichnis res/gespeichert sind, werden jedoch unterstützt.

Wenn Sie Dateien aus einem Bibliotheksprojekt einschließen möchten, müssen Sie sie anstelle der Assets in die Ressourcen einfügen. Wenn Sie versuchen, HTML-Dateien aus Ihrem Bibliotheksprojekt in eine WebView zu laden, müssen Sie eine umfassendere Methode als die übliche Asset-URL verwenden. Stattdessen müssen Sie die Ressourcendaten lesen und etwas wie loadData verwenden. 

Diese Antwort ist veraltet , das Gradle Build System und AAR-Dateien unterstützen Assets.

79
kabuko

Dies ist jetzt mit dem Gradle-Build-System möglich.

Beim Testen mit Android Studio 0.5.0 und v0.9 des Android Gradle Plugins habe ich festgestellt, dass Dateien wie 

MyLibProject/src/main/assets/test.html

sind in der endgültigen Anwendung korrekt verpackt und können zur Laufzeit über die erwartete URL abgerufen werden:

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

Okay. Ich habe schon eine Weile gestresst und habe den Schlaf verloren. Ich bin der Typ von Person, die die API-Erstellung liebt und die Integration kompliziert gestaltet.

Es gibt nicht viele Lösungen im Internet, also bin ich ziemlich stolz auf das, was ich mit etwas Eclipse Hackery entdeckt habe.

Es stellt sich heraus, dass, wenn Sie eine Datei in den Ordner der Android Lib/Assets ablegen. Die Ziel-APK erfasst dies und speichert es im Stammverzeichnis des APK-Archivs. Wenn der allgemeine Zugriff fehlschlägt, kann dies behoben werden. Dies kann durch einfaches Erstellen einer Raw-Java-Bibliothek und durch Platzieren aller Assets (z. B. (JAVALIB) /assets/fileX.txt) gelöst werden.

Sie können diese wiederum als Java Build Path Folder-Quelle in Projekt> Eigenschaften> Java Build Path> Source> Link Source einfügen.

  1. Link-Quelle
  2. Klicken Sie auf Variablen. und Neue Variable hinzufügen, z. B. VAR_NAME_X. location: ../../(relative_path_to_assets_project)
  3. OK klicken

Wenn Sie jetzt Ihre App erstellen und ausführen, enthält der Assets-Ordner im APK Ihre (GLOBAL Library) -Dateien wie beabsichtigt.

Keine Notwendigkeit, Android-Interna neu zu konfigurieren oder nichts. Mit nur wenigen Klicks von Eclipse ist alles möglich.

12
Daniel Grant

Sie können dies erreichen, indem Sie im Asset-Ordner des Projekts einen symbolischen Link erstellen, der auf das Verzeichnis im Bibliotheksprojekt verweist.

Dann können Sie wie folgt zugreifen:

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

Ich bestätige, dass der Ansatz von Daniel Grant zumindest für die folgende Situation funktioniert: Zielprojekt hat KEINEN Asset-Ordner (oder der Ordner ist leer, sodass Sie ihn sicher löschen können). Ich habe keine Variable eingerichtet . Richten Sie eine LinkSource wie folgt ein (nur ein Beispiel) Verknüpfter Ordner: /home/matthew/workspace_moonblink/assetsForAdvocacy/assets Ordnername: Assets

"AssetsForAdvocacy" ist ein Java-Projekt (erstellt mit New Project - Java-Projekt) mit leerem src-Ordner und einem neuen Ordner mit dem Namen "assets", das jetzt den gesamten Assets-Ordner für das Zielprojekt bereitstellt. 

Dies ist ein recht einfacher Weg innerhalb von Eclipse, um die Wiederverwendung von Assets in vielen verschiedenen Projekten bereitzustellen, wenn sie nicht bereits über Assets verfügen, die gut genug sind, um mit ihnen zu beginnen. Ich möchte es wahrscheinlich verbessern, um auf lange Sicht ein Anbieter von Inhalten zu werden, aber das ist viel mehr Entwicklung. 

Mein Projekt greift mit folgendem Code auf die Assets zu: String advocacyFolderInAssets = "no_smoking /"; // ein Ordner unter Assets / Zeichenfolge fn = advocacyFolderInAssets + imageFilename; Bitmap pristineBitmapForAdvocacy = getBitmapFromAsset (Kontext, Fn);

Ich verwende Motodev Studio 3.1.0 unter Ubuntu. Es würde mir nicht erlauben, einen neuen Assets-Ordner im neuen Assets-Only-Projekt mit einem vorhandenen Assets-Ordner im Zielprojekt zusammenzuführen.

4
mbarton888

Wenn Sie ein Setup verwenden möchten, bei dem mehrere Derivate-Produkte aus einer Bibliothek erstellt werden, können Sie die Verwendung von svn: externals oder einer ähnlichen Lösung in Ihrem SCM-System in Betracht ziehen. Dies bewirkt auch den Trick, dass statische Assets wie die Online-Hilfe getrennt vom Android-Quellcode versioniert werden können.

1
FINARX

Ich habe diese ältere Frage gefunden, es könnte Ihnen auch helfen.

Dies ist die offizielle Art und Weise, wie Google dies archiviert (vom obigen Beitrag): Link

0
Lukas Knuth