【问题标题】:Access Assests from another application?从另一个应用程序访问资产?
【发布时间】:2010-03-16 13:04:25
【问题描述】:

我在我的应用程序中收到很多请求,以允许来自 BetterCut / Open Home 的自定义图标包。它的工作方式似乎是你安装 BetterCut 或 Open Home,然后你可以从市场上安装大量这些免费的图标包。安装后,这两个应用程序(和其他应用程序)都会轮询这些图标包并使用这些图标。

我想知道如何为可用的资产文件夹轮询安装应用程序。我打开了几个图标包,确认里面有一个 assets 文件夹,里面装满了所有的图标 png 文件。

我在这里、其他代码网站、谷歌等上搜索过,但没有找到任何线索。

更新:

根据下面的答案,我编写了一些代码来尝试从我自己的项目资产目录中列出一个文件,但它似乎不起作用。

Resources r = this.getResources();
AssetManager a = r.getAssets();
String[] list = a.list("/");
Log.d("test", "Length of / is "+list.length);
for (String s : list) {
    Log.d("test", s);
}

Log.d("test", "Length of /assets is "+a.list("/assets").length);
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length);
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length);
Log.d("test", "Length of ./assets/ is "+a.list("./assets/").length);
Log.d("test", "Length of ./assets is "+a.list("./assets").length);

这是输出:

03-16 12:25:04.591: DEBUG/test(13526): Length of / is 6
03-16 12:25:04.591: DEBUG/test(13526): AndroidManifest.xml
03-16 12:25:04.591: DEBUG/test(13526): META-INF
03-16 12:25:04.591: DEBUG/test(13526): assets
03-16 12:25:04.591: DEBUG/test(13526): classes.dex
03-16 12:25:04.591: DEBUG/test(13526): res
03-16 12:25:04.591: DEBUG/test(13526): resources.arsc
03-16 12:25:04.614: DEBUG/test(13526): Length of /assets is 0
03-16 12:25:04.637: DEBUG/test(13526): Length of /assets/ is 0
03-16 12:25:04.661: DEBUG/test(13526): Length of /assets/ is 0
03-16 12:25:04.692: DEBUG/test(13526): Length of ./assets/ is 0
03-16 12:25:04.716: DEBUG/test(13526): Length of ./assets is 0

更新 2 99% 在那里!!!:

我发现您可以从资产目录中读取而无需实际使用文件夹名称:

InputStream is = assetManager.open("test.png");

我还在应用程序 1 中的应用程序 2 中尝试了此操作,其中文件夹路径为 /asset/icon/image.png:

InputStream is = assetManager.open("icon/image.png");

接下来我发现你可以在 assets 中列出一个目录:

String[] list = assetManager.list("icons");

这也很好用。现在唯一失败的是如何列出基本目录资产。

【问题讨论】:

    标签: android


    【解决方案1】:

    要获取基本的/assets 文件夹,您需要使用 AssetsManager 列出带有引号的目录:

    AssetManager am = this.getAssets();
    String[] names = am.list("");
    

    还会列出一些附加文件:图像、声音、webkit,也许还有其他文件。您可以忽略这些目录,它们是框架资产目录的一部分。这是来自groups.google.com的引用:

    目前资产管理器合并 框架中的资产目录 资源以及您自己的文件 放在“资产”中。我们应该 可能会改变这种行为(它是 旧资源/本地化的一部分 模型),但它不会造成太大的伤害 除了你看到更多 您自己资产中的文件/目录 超出您的预期。你的任何一个 与文件中的一个相同的文件 将使用框架资产, 当通过您的 资产管理器。

    您也可以在 assets 目录中列出一个子文件夹,并且不需要任何斜线:

    String[] names= am.list("subfolder");
    

    请注意,我没有在文件名中包含"/assets"。 最后,一旦你有了你的文件列表,你就可以像这样加载它们:

    InputStream in = am.open("file.png");
    

    这将加载到基础资产文件夹中的文件中。或者您可以像这样在子文件夹中加载文件:

    InputStream in = am.open("subfolder/file.png");
    

    如果您需要将这些 png 加载到位图中,您还可以执行以下操作:

    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    

    【讨论】:

    • 这似乎可以解决问题,谢谢!同样有趣的是,关于框架资产与资产文件夹合并的引用是由谷歌员工 Hackbod 提出的,他是同一个人并没有在此处提供答案。
    【解决方案2】:

    Resources 对象使您可以访问资产。 PackageManager 可以让您访问Resources 的应用程序。

    【讨论】:

    • 我认为我应该在走路之前爬行并将文件添加到我的项目资产文件夹中,现在我正在尝试使用 AssetManager 列出它,但在尝试列出资产目录。我将使用我正在尝试的代码更新原始帖子。
    • 我尝试使用该人确切的“displayFiles”方法并打印以查看列表的长度,对于除根文件夹“/”之外的所有测试,该长度仍然为零。我从来没有得到“/assets”中的文件列表来列出它们。我还尝试使用以下命令直接访问资产文件夹中的文件: InputStream is = a.open("/assets/test.png");这会引发文件未找到异常。
    【解决方案3】:

    在深入研究之前,您可能应该对资源和资产的工作原理有一个基本的了解。 :)

    首先,.apk 只是一个 zip 文件,所以您要做的就是挖掘其内容,然后将该文件放在您的主机上并使用所有普通的 zip 工具来查看它。

    其次,.apk 中有两种主要类型的用户提供的文件:原始资产和结构化资源。

    前者只是可以使用http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)检索的任意文件层次结构

    后者由内置工具处理成结构化表格,允许它们因配置而异。使用资源和相关类访问它们。您从 .apk 中检索的可绘制对象、字符串、颜色和大多数其他类型的数据通常存储为资源,而不是资产。

    您可以使用 aapt 工具查看 .apk 中的所有资源:aapt dump resources

    最后,如果您想从这些 .apk 中读取数据,如何查看它们的信息以了解如何构建它们?这应该会为您提供很多关于它们的结构所需的非常基本的信息。

    【讨论】:

    • 我不需要访问我计算机上的文件。我需要从手机本身的应用程序 1 访问应用程序 2 中的资产目录。我收到一大堆请求,要求增加对市场上免费的 BetterCut 图标包的支持。因此,从我的应用程序中,我希望用户能够从那里选择图标(它们存储在 assets 文件夹中,我查看了)。您提到的大多数事情与原始问题并不真正相关。我不需要从 res 文件夹中构建 apk、提取图像或在我自己的应用程序中使用 Drawable 或其他资源的指南。
    猜你喜欢
    • 2016-06-02
    • 2021-01-15
    • 2012-11-23
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多