2010-03-16 107 views
6

我的应用程序中有很多请求允许来自BetterCut/Open Home的自定义图标包。它似乎工作的方式是安装BetterCut或Open Home,然后您可以从市场上安装大量这些免费图标包。一旦安装这些应用程序(和其他应用程序)将轮询这些图标包并使用图标。从另一个应用程序访问资源?

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

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

UPDATE:

从下面我写一些代码,试图从我自己的项目资产目录列表中的文件,但它似乎并没有工作了答案。

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中的资产,其中文件夹路径是/ a SSET /图标/ image.png:

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

接下来,我想通了,你可以列出内部资产目录:

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

这也伟大工程。现在唯一不能解决的问题是如何列出基本目录资产。

回答

4

要得到你需要使用AssetsManager列出目录只引用了基础/assets文件夹:

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

这似乎是做伎俩,谢谢!另外有趣的是,与资产文件夹合并的框架资产的报价是由Google员工Hackbod提供的,该用户与此处未提供答案的人员相同。 – pcm2a 2010-03-16 22:01:02

3

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

+0

我想我应该爬之前我走并将一个文件添加到我的项目资产文件夹中,现在我试图使用AssetManager列出它,但在尝试列出资产目录时似乎是不行。 我将用我正在尝试的代码更新原始帖子。 – pcm2a 2010-03-16 17:25:27

+1

请参阅http://stackoverflow.com/questions/1495585/how-can-i-get-a-directory-listing-of-resources-from-my-android-app – CommonsWare 2010-03-16 17:53:36

+0

我尝试使用那些确切的“displayFiles”方法然后放入一个打印文件以查看列表的长度,除了根文件夹“/”之外的所有测试都是零。 我从来没有得到“/ assets”中的文件列表来列出它们。 我也尝试去我的资产文件夹中的一个文件: InputStream is = a.open(“/ assets/test.png”); 引发文件未找到异常。 – pcm2a 2010-03-16 18:05:58

2

您应该先深入了解资源和资产在挖掘事物之前的工作原理。 :)

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

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

前者是文件只是一个任意层次可以与http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)

后者被检索的内置工具加工成结构化的表格,让他们通过配置来改变。可以使用资源和相关类访问它们。 Drawable,字符串,颜色以及从.apk检索的大多数其他类型的数据通常作为资源存储,而不是资产。

您可以使用aapt工具查看所有的资源。apk:aapt转储资源

最后,如果你想从这些.apks中读取数据,那么查看他们关于如何构建它们的信息呢?这应该会给你很多非常基本的信息,你需要它们的结构。

+0

我不需要访问我的电脑上的文件。我需要从手机本身的应用程序1访问应用程序2中的资产目录。 我收到了一大堆的请求来增加对市场上免费的BetterCut图标包的支持。所以从我的应用程序,我希望用户能够从那里选择图标(他们存储在资产文件夹,我看)。 您提到的大部分内容与原始问题并不完全相关。我不需要指导构建apks,从res文件夹中提取图像或在我自己的应用程序中使用Drawable或其他资源。 – pcm2a 2010-03-16 19:25:22

相关问题