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中可用资源包的列表,以便我可以搜索他们的资源标识符?
答案 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);