как ссылаться на актив в библиотечном проекте - PullRequest
51 голосов
/ 14 июня 2011

В классе, принадлежащем проекту Library , который я вызываю:

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

К сожалению, это работает, только если я дублирую файл info.html в Папка ресурсов проекта приложения.

Есть ли способ сообщить код библиотеки Android: "найдите этот файл в папке ресурсов библиотеки, , а не впапка ресурсов приложения "?

Ответы [ 7 ]

80 голосов
/ 14 июня 2011

Из Документов для Android :

Библиотечные проекты не могут включать необработанные активы

Инструменты не поддерживают использование необработанных файлов активов (сохраненных в каталоге assets /) в проекте библиотеки. Любые ресурсы ресурсов, используемые приложением, должны храниться в каталоге assets / самого проекта приложения. Однако файлы ресурсов, сохраненные в каталоге res /, поддерживаются.

Если вы хотите включить файлы из проекта библиотеки, вам нужно будет поместить их в ресурсы вместо ресурсов. Если вы пытаетесь загрузить HTML-файлы из вашего библиотечного проекта в WebView, это означает, что вам придется использовать более обходной метод, чем обычный URL-адрес ресурса. Вместо этого вам придется читать данные ресурса и использовать что-то вроде loadData .

Этот ответ устарел , система поддержки gradle build и файлы поддержки AAR.

20 голосов
/ 07 марта 2014

Теперь это возможно с помощью системы сборки Gradle.

При тестировании с Android Studio 0.5.0 и v0.9 плагина Android Gradle, я обнаружил, что такие файлы, как

MyLibProject/src/main/assets/test.html

правильно упакованы в конечном приложении и доступны во время выполнения по ожидаемому URL:

file:///android_asset/test.html
12 голосов
/ 26 апреля 2012

Хорошо. Я немного нервничал и терял сон из-за этого. Я тот человек, который любит создание API, и ненавидит сложную интеграцию.

В Интернете не так много решений, поэтому я очень горжусь тем, что я обнаружил с помощью небольшого количества Eclipse Hackery.

Оказывается, когда вы помещаете файл в папку / assets Android Lib. Целевой apk перехватит это и поместит в корень архива APK. Таким образом, общий доступ не работает. Эту проблему можно решить, просто создав библиотеку Raw Java и поместив туда все ресурсы, например (JAVALIB) /assets/fileX.txt.

.

Затем вы можете включить его в качестве источника папки пути сборки Java в Проект> Свойства> Путь сборки Java> Источник> Источник ссылки.

  1. Источник ссылки
  2. Нажмите на переменные. и добавьте новую переменную, т.е. VAR_NAME_X. местоположение: ../../(relative_path_to_assets_project)
  3. Нажмите Ok

Теперь, когда вы создаете и запускаете свое приложение, папка ресурсов в APK будет содержать ваши файлы (GLOBAL Library), как вы и планировали.

Нет необходимости перенастраивать внутренности Android или ничего. Все это возможно в нескольких кликах от Eclipse.

11 голосов
/ 10 сентября 2012

Этого можно добиться, создав символическую ссылку в папке ресурсов проекта, которая указывает на каталог в проекте библиотеки.

Затем вы можете получить доступ, как показано ниже:

webview.loadUrl("file:///android_asset/folder_in_a_libary_project/info.html", null);
4 голосов
/ 28 июня 2012

Я подтверждаю, что подход Даниэля Гранта работает, по крайней мере, в следующей ситуации: целевой проект НЕ имеет папки с активами (или папка пуста, так что вы можете безопасно удалить ее). Я не настроил ни одной переменной. Просто настройте LinkSource следующим образом (просто пример) Расположение связанной папки: / home / matthew / workspace_moonblink / assetsForAdvocacy / assets Имя папки: активы

"assetsForAdvocacy" - это проект Java (созданный с помощью New-Project - Java Project) с пустой папкой src и новой папкой с именем "assets", которая теперь предоставляет всю папку ресурсов для целевого проекта.

Это довольно простой способ в Eclipse обеспечить повторное использование активов во многих различных проектах, ЕСЛИ у них еще нет активов, достаточно хороших для начала работы. Я бы, вероятно, хотел бы улучшить его, чтобы стать поставщиком контента в долгосрочной перспективе, но это намного больше развития.

Мой проект обращается к ресурсам с помощью следующего кода: String advocacyFolderInAssets = "no_smoking /"; // папка под активами / String fn = advocacyFolderInAssets + imageFilename; Растровое изображение pristineBitmapForAdvocacy = getBitmapFromAsset (context, fn);

Я использую Motodev Studio 3.1.0 в Ubuntu. Это не позволило бы мне «слить» новую папку ресурсов в новом проекте только для активов в существующую папку ресурсов в целевом проекте.

1 голос
/ 26 мая 2013

Если вы хотите использовать установку, в которой несколько производных продуктов создаются из одной библиотеки, вы можете рассмотреть возможность использования svn: externals или аналогичного решения в вашей системе SCM. Это также поможет добиться того, что статические ресурсы, такие как онлайн-справка, могут быть отделены от исходного кода Android отдельно.

0 голосов
/ 14 июня 2011

Я нашел этот старый вопрос , он тоже может вам помочь.

Это официальный способ, которым Google использует для архивирования (из приведенного выше поста): Ссылка

...