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

Cam*_*ide 6 android

我在我的应用程序中收到了很多请求,允许使用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);
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

更新2 99%那里!!!:

我发现你可以从assets目录中读取而不实际使用文件夹名称:

InputStream is = assetManager.open("test.png");
Run Code Online (Sandbox Code Playgroud)

我还尝试使用应用程序1中的应用2中的资源,其中文件夹路径为/asset/icon/image.png:

InputStream is = assetManager.open("icon/image.png");
Run Code Online (Sandbox Code Playgroud)

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

String[] list = assetManager.list("icons");
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k B 4

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

AssetManager am = this.getAssets();
String[] names = am.list("");
Run Code Online (Sandbox Code Playgroud)

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

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

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

String[] names= am.list("subfolder");
Run Code Online (Sandbox Code Playgroud)

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

InputStream in = am.open("file.png");
Run Code Online (Sandbox Code Playgroud)

这将加载到基本资产文件夹中的文件中。或者您可以在子文件夹中加载文件,如下所示:

InputStream in = am.open("subfolder/file.png");
Run Code Online (Sandbox Code Playgroud)

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

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
Run Code Online (Sandbox Code Playgroud)