2010-03-16 64 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

相關問題