[英]Access Assests from another application?
我在我的应用程序中收到了很多请求,允许使用BetterCut / Open Home中的自定义图标包。 它似乎工作的方式是你安装BetterCut或Open Home,然后你可以从市场上安装大量这些免费的图标包。 安装完成后,这些应用程序(和其他应用程序)将轮询这些图标包并使用图标。
我想知道如何轮询安装应用程序以查找可用的资产文件夹。 我已经打开了一些图标包并验证了那里有一个资产文件夹,它们充满了所有的图标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%那里!!!:
我发现你可以从assets目录中读取而不实际使用文件夹名称:
InputStream is = assetManager.open("test.png");
我还尝试使用应用程序1中的应用2中的资源,其中文件夹路径为/asset/icon/image.png:
InputStream is = assetManager.open("icon/image.png");
接下来我发现你可以在资产中列出一个目录:
String[] list = assetManager.list("icons");
这也很有效。 现在唯一失败的是如何列出基本目录资产。
要获取base /assets
文件夹,您需要使用AssetsManager列出仅带引号的目录:
AssetManager am = this.getAssets();
String[] names = am.list("");
将列出一些其他文件:图像,声音,webkit,也许还有其他文件。 您可以忽略这些目录,它们是框架资产目录的一部分。 这是来自groups.google.com的报价:
目前,资产管理器将框架资源中的资产目录与放置在“assets”中的您自己的文件合并。 我们应该改变这种行为(它是旧资源/本地化模型的一部分),但它不会造成太大的损害,除非您在自己的资产中看到比您预期的更多的文件/目录。 当通过AssetManager访问时,将使用与框架资产中的文件相同的任何文件。
您还可以在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);
Resources
对象使您可以访问资产。 PackageManager
可以让您访问应用程序的Resources
。
在挖掘事物之前,您应该可以获得资源和资产如何工作的基本概述。 :)
首先,.apk只是一个zip文件,所以你想要做的就是挖掘它的内容,你可以将该文件放在你的主机上,并使用所有普通的zip工具来查看它。
其次,.apk中有两种主要类型的用户提供的文件:原始资产和结构化资源。
前者只是一个任意的文件层次结构,可以使用http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)检索。
后者由构建的工具处理成结构化表,允许它们根据配置而变化。 可以使用Resources和相关类访问它们。 从.apk检索的Drawable,字符串,颜色和大多数其他类型的数据通常存储为资源,而不是资产。
您可以使用aapt工具查看.apk:aapt转储资源中的所有资源
最后,如果您想从这些.apks中读取数据,那么如何查看有关如何构建它们的信息呢? 这应该为您提供了很多基本信息,您需要了解它们的结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.