从另一个应用程序访问资产?

时间:2010-03-16 13:04:25

标签: android

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

我想知道如何轮询安装应用程序以查找可用的资产文件夹。我已经打开了一些图标包并验证了那里有一个资产文件夹,它们充满了所有的图标png文件。

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

更新:

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

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");

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

将列出一些其他文件:图像,声音,webkit,或许其他人。您可以忽略这些目录,它们是框架资产目录的一部分。这是groups.google.com的引用:

  

目前资产经理合并了   来自框架的资产目录   资源以及您自己的文件   置于“资产”中。我们应该   可能会改变这种行为(它是   旧资源/本地化的一部分   模型),但它没有造成太大的伤害   除了你看到更多   您自己资产中的文件/目录   比你想象的还要多。你的任何一个   与。中的文件相同的文件   将使用框架资产,   通过你的访问   AssetManager。

您还可以在资源目录中列出子文件夹,不需要任何斜杠:

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);

答案 1 :(得分:3)

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

答案 2 :(得分:2)

在挖掘内容之前,您应该可以获得有关资源和资产如何工作的基本概述。 :)

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

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

前者只是可以使用http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)

检索的任意文件层次结构

后者由构建的工具处理成结构化表,允许它们根据配置而变化。可以使用Resources和相关类访问它们。从.apk检索的Drawable,字符串,颜色和大多数其他类型的数据通常存储为资源,而不是资产。

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

最后,如果您想从这些.apks中读取数据,那么如何查看有关如何构建它们的信息呢?这应该会为您提供很多关于它们结构的基本信息。