2014-02-14 43 views
2

Resources.getIdentifier(String,String,String)需要資源包。不幸的是,如果APK是使用aapt--rename-manifest-package選項構建的,則資源包將不會與從Context.getPackageName()返回的包相同。例如,如果AndroidManifest.xml有以下幾點:在運行時列出可用的Android資源包?

<manifest package="foo.bar" ...> 
... 
</manifest> 

aapt運行與--rename-manifest-package foo.bar.baz,那麼APK的資源將有包名foo.barContext.getPackageName()將返回foo.bar.baz。因此,每當使用來自Context.getPackageName()的包名時,對Resources.getIdentifier(String,String,String)的調用將返回0

如何獲取APK中可用資源包的列表,以便我可以搜索他們以獲取我的資源標識符?

回答

1

https://groups.google.com/forum/?fromgroups=#!topic/adt-dev/cqdjG2TuM-I

來自澤維爾Ducrohet:

他們作一個假設,該應用程序的包名稱相同 爲R類。這真的是不正確的。儘管之前的版本 系統有所暗示,但aapt始終具有在不同包中生成R類的功能。

考慮一下,目前還沒有現有的方式來查詢應用程序的 R類的包。它必須提供給圖書館。

基本上,沒有辦法做到這一點。包名必須明確地傳遞給庫。

您可以自動通過using a dummy R file通過包名:

這很容易,雖然修復,通過檢索與Resources.getResourcePackageName另一 資源的包名()。

讓我們在 RES /價值/ ids.xml創建專用於該目的的資源ID,例如:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

而現在我們得到正確的包:

Resources res = context.getResources(); 
String packageName = res.getResourcePackageName(R.id.used_for_package_name_retrieval); 
int id = res.getIdentifier("some_drawable", "drawable", packageName); 
+0

我不明白這個實現,難道你不需要知道R的包爲了將其導入到java文件?如果不是,你不能編譯它 – tik27

2

我不相信有一種方法可以在Resources中列出包標識符,但是您始終可以使用具有已知R值的getResourceTypeName()來獲取包名。喜歡的東西:

String packageName = res.getResourcePackageName(R.drawable.ic_launcher); 
res.getIdentifier("name", "type", packageName); 

我知道,因爲它需要你先通過已知資源ID是不理想,但它可能是你唯一的選擇。

+0

http://www.piwai.info/renaming-android-manifest-package也提到了這個想法。我向你致敬,但不是正確的,因爲那不是我所追求的。 –

+0

@HeathBorders - 考慮到你剛剛在你自己的答案中編輯了相同的功能,你不覺得你應該給Devunwired提出建議它的接受功勞嗎? –

+0

我已經知道這個解決方案,這並不完全是我在尋找這個問題的答案。這是一種解決方法。我給了他一個upvote。我應該也許已經將這個鏈接加入到我的問題中,因爲我已經知道了。我在谷歌上找到的答案是正確的。它不能做到。 –

相關問題