如何在库项目中引用资产

Posted

技术标签:

【中文标题】如何在库项目中引用资产【英文标题】:how to reference an asset in a library project 【发布时间】:2011-09-14 20:52:22 【问题描述】:

在属于 Library 项目的类中,我称之为:

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

不幸的是,这仅在我将 info.html 文件复制Application 的项目资产文件夹中时才有效。

有没有办法告诉 Android 库代码:“在库的资产文件夹中查找此文件,不是在应用程序的资产文件夹中”?

【问题讨论】:

三年后,这终于成为可能。看我的回答:***.com/a/22254488/385478 【参考方案1】:

这个答案是out of date,gradle build system 和 AAR 文件支持资产。


来自Android Docs:

图书馆项目不能包含原始资产

这些工具不支持在库项目中使用原始资产文件(保存在 assets/ 目录中)。应用程序使用的任何资产资源都必须存储在应用程序项目本身的 assets/ 目录中。但支持保存在 res/ 目录下的资源文件。

如果要包含库项目中的文件,则需要将其放入资源而不是资产中。如果您尝试将 HTML 文件从库项目加载到 WebView 中,这意味着您必须采用比通常的资产 URL 更迂回的方法。相反,您必须阅读资源数据并使用loadData 之类的内容。

【讨论】:

loadData 的问题是,加载的 html 中引用的图像和其他页面元素如果没有大量黑客攻击就无法加载。 @kabuko Google 的解释我不清楚。我有一个具有库依赖项的项目。我在这个库项目中有一个路径 assets/dir/index.html、js、css 文件,这是从我的应用程序加载的。我正在使用 IntelliJ,并且有一个选项可以告诉编译器“将依赖项中的资产包含到 APK 中”。在编译时,它会合并这两个资产。这是开发人员的常见做法。确保您有不同的目录和文件名,不会与应用程序的文件冲突。 @Nizzy 这完全有可能是 IntelliJ 中包含的功能。我不经常使用 IntelliJ 或 Android Studio,所以在这方面我不能说太多。我纯粹是根据使用 Eclipse 和 Ant 的经验(2.5 年前启动)以及注意 Google 自己的文档说的。我会想象 IntelliJ 只是在做 OP 描述的事情:复制文件,尽管只是在构建过程中。 感谢更新答案。现在 gradle 构建系统允许我们将资产添加到 Android 库中,是否可以直接从 Android 库中访问它们,或者它们只是合并到应用模块中,我们单独访问它们?【参考方案2】:

现在可以使用 Gradle 构建系统。

用Android Studio 0.5.0和v0.9的Android Gradle插件测试,发现文件如

MyLibProject/src/main/assets/test.html

在最终应用程序中正确打包,并且可以在运行时通过预期的 URL 访问:

file:///android_asset/test.html

【讨论】:

您将一个名为 assets 的文件夹放在 src 目录中,这不是标准的。资产文件夹位于 eclipse 项目/intellij 模块的根目录中 @StealthRabbi 错了。见***.com/questions/18302603/… 此代码不起作用。从 url.openStream 得到异常“没有这样的文件”。 URL url = 新 URL("file:///android_asset/test.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 我正在构建库模块。没有得到如何在库模块资产中打开现有数据库。这是路径的问题。在 MainApplication 的早期我曾经通过 applicationContext.getAssets().open(dbName) 访问它,但现在我不知道实现相同的正确方法在库模块中 @VeereshP,我构建了一个库并想通过 getAssets() 方法访问资产文件,但它在库中不起作用,您找到解决方案了吗?【参考方案3】:

您可以通过在项目的资产文件夹中创建一个指向库项目中目录的符号链接来实现此目的。

然后你可以访问如下:

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

【讨论】:

这是这里最有用的答案! +1 以获得真正的答案:D 在 eclipse 中,只需将资产文件夹从 explorer/finder/whatever 拖到项目中并选择链接它.. 最快的方法【参考方案4】:

好的。一段时间以来,我一直为此感到压力和失眠。我是那种喜欢创建 API,讨厌复杂集成的人。

互联网上的解决方案并不多,所以我为我通过一些 Eclipse Hackery 发现的东西感到非常自豪。

事实证明,当您将文件放入 Android Lib 的 /assets 文件夹时。目标 apk 将捕获此内容并将其放置在 APK 存档的根目录中。因此,使一般访问失败。 这可以通过简单地创建一个原始 Java 库并将所有资产放入其中来解决,即 (JAVALIB)/assets/fileX.txt。

然后您可以将其作为 Java 构建路径文件夹源包含在 项目 > 属性 > Java 构建路径 > 源代码 > 链接源代码。

    链接源 单击变量。并添加新变量,即VAR_NAME_X。位置:../../(relative_path_to_assets_project) 点击确定

现在,当您构建和运行应用时,APK 中的 assets 文件夹将包含您想要的(GLOBAL 库)文件。

无需重新配置 android 内部或什么都不需要。只需单击 Eclipse 几下,即可实现所有功能。

【讨论】:

+1 是一个很好的解决方法,但是“原始 Java 库”是什么意思?如何在 Eclipse 上创建一个?谢谢! 你应该写一个概念证明。我怀疑这是否真的以熟悉 android 项目中的资产的人所期望的方式起作用。例如,可以使用“file:///android_asset” url 引用生成的资产吗? 这对我有用,@TomDignan,所以我发布了一个 sample project,它使用链接资源作为其资产文件夹。【参考方案5】:

我确认 Daniel Grant 的方法至少适用于以下情况:目标项目没有资产文件夹(或文件夹为空,因此您可以安全地删除它)。 我没有设置任何变量。 只需按如下方式设置 LinkSource(仅作为示例) 链接文件夹位置:/home/matthew/workspace_moonblink/assetsForAdvocacy/assets 文件夹名称:资产

“assetsForAdvocacy”是一个 Java 项目,(使用 New-Project - Java Project 创建)具有空的 src 文件夹和一个名为“assets”的新文件夹,它现在为目标项目提供了整个 assets 文件夹。

这是 Eclipse 中一种相当简单的方法,可以在许多不同项目中提供资产重用,如果它们还没有资产,足以开始使用的话。从长远来看,我可能希望增强它以成为内容提供商,但这需要更多的发展。

我的项目使用以下代码访问资产: 字符串 advocacyFolderInAssets = "no_Smoking/"; //assets下的一个文件夹/ 字符串 fn =advocacyFolderInAssets+imageFilename; 位图 pristineBitmapForAdvocacy = getBitmapFromAsset(context, fn);

我在 Ubuntu 上使用 Motodev Studio 3.1.0。它不会让我将新的仅资产项目中的新资产文件夹“合并”到目标项目中的现有资产文件夹中。

【讨论】:

【参考方案6】:

如果您想使用从一个库创建多个衍生产品的设置,您可以考虑在 SCM 系统中使用 svn:externals 或类似解决方案。这也可以实现在线帮助等静态资产的版本控制与 android 源代码分开。

【讨论】:

【参考方案7】:

我找到了this older question,它也可能对你有帮助。

这是谷歌用来存档的官方方式(来自上面的帖子):Link

【讨论】:

谢谢。不幸的是,该线程没有解释如何引用库项目中的资产。 是的,它确实......即使有图片:Link 不,它没有。仅如何引用库项目,而不是库项目中的资产。

以上是关于如何在库项目中引用资产的主要内容,如果未能解决你的问题,请参考以下文章

如何在库项目中测试 Yii2 模型?

如何在库项目中测试Yii2模型?

如何在库模块Android Studio中调用主应用程序模块功能

Xcode 5和资产目录:如何引用LaunchImage?

如何在 dll 级别读取 app.config。? [复制]

在库的情况下对函数的未定义引用