在运行时列出可用的Android资源包?

时间:2014-02-14 04:28:22

标签: android android-resources

Resources.getIdentifier(String,String,String)需要资源包。不幸的是,如果APK是使用aapt的{​​{1}}选项构建的,则资源包将与从Context.getPackageName()返回的包不同。例如,如果--rename-manifest-package具有以下内容:

AndroidManifest.xml

但是<manifest package="foo.bar" ...> ... </manifest> aapt一起运行,然后APK的资源将包含名称--rename-manifest-package foo.bar.baz,而foo.bar将返回Context.getPackageName()。因此,只要使用foo.bar.baz的包名称,对Resources.getIdentifier(String,String,String)的调用就会返回0

如何获取APK中可用资源包的列表,以便我可以搜索他们的资源标识符?

2 个答案:

答案 0 :(得分:2)

我不相信有一种方法可以在Resources中列出包标识符,但您始终可以使用具有已知R值的getResourceTypeName()来获取包名称。类似的东西:

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

我发现它并不理想,因为它要求您先传递已知的资源ID,但它可能是您唯一的选择。

答案 1 :(得分:1)

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

来自Xavier Ducrohet的

  

他们假设应用程序的包名称相同   作为R类。这真的不对。而以前的构建   系统有点暗示这一点,aapt总是有生成的功能   R类在不同的包中。

     

考虑到它确实没有当前的方式来查询应用程序   R类的包。它必须提供给图书馆。

基本上,没有办法做到这一点。包名称必须显式传递给库。

您可以按using a dummy R file自动传递包名:

  

通过检索另一个的包名称,很容易修复   资源与Resources.getResourcePackageName()。

     

让我们创建一个专门用于此目的的资源ID,例如   RES /值/ ids.xml:

<?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);