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

列出运行时可用的Android资源包?,android,android-resources,Android,Android Resources,需要资源包。不幸的是,如果APK是使用aapt的--rename manifest package选项构建的,那么资源包将与从中返回的包不同。例如,如果AndroidManifest.xml具有以下内容: <manifest package="foo.bar" ...> ... </manifest> ... 但是aapt与--重命名清单包foo.bar.baz一起运行,那么APK的资源将具有包名foo.bar,而Context.getPackageName()将返

需要资源包。不幸的是,如果APK是使用
aapt
--rename manifest package
选项构建的,那么资源包将与从中返回的包不同。例如,如果
AndroidManifest.xml
具有以下内容:

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

...
但是
aapt
--重命名清单包foo.bar.baz
一起运行,那么APK的资源将具有包名
foo.bar
,而
Context.getPackageName()
将返回
foo.bar.baz
。因此,每当使用
Context.getPackageName()中的包名时,对
Resources.getIdentifier(String,String,String)
的调用将返回
0


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

我认为没有方法在
资源中列出包标识符,但您可以始终使用
getResourceTypeName()
和已知的R值来获取包名称。比如:

String packageName = res.getResourcePackageName(R.drawable.ic_launcher);
res.getIdentifier("name", "type", packageName);
我意识到这并不理想,因为它要求您首先传递一个已知的资源ID,但这可能是您唯一的选择。

请参阅

来自Xavier Ducrohet:

他们假设应用程序的包名是相同的 作为R类。这确实是不对的。而以前的构建 系统在某种程度上暗示了这一点,aapt始终具有要生成的特性 R类在另一个包中

想一想,目前确实没有查询应用程序的方法 R类的包。必须提供给图书馆

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

您可以通过以下方式自动传递包名:

不过,通过检索另一个包的包名很容易修复 具有Resources.getResourcePackageName()的资源

让我们创建一个专用于该目的的资源id,例如 res/values/ids.xml:


也提到了这个想法。我给了你一张赞成票,但没有给你打上正确的标记,因为这不是我想要的。@HeathBorders-考虑到你刚刚将同样的功能编辑到了自己的答案中,你不认为你应该为Devunwired的提议给予认可吗?我已经知道这个解决方案,严格来说,这并不是我想要的这个问题的答案。这是一个解决办法。我给了他一票。我也许应该在我的问题中添加这个链接,因为我已经知道了。我在谷歌上找到的答案是正确的。这是不可能的。我不理解这个实现,你不需要知道R的包才能将它导入java文件吗?如果不是,你就不能编译它
<?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);