在我的应用中使用图标包

3
我的应用程序包括一个功能,可以列出用户设备上安装的所有应用程序以及完整的图标。现在用户要求在这个列表中支持图标包。目前,我使用以下方式列出已安装的应用程序:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

final List<ResolveInfo> rgRi = pm.queryIntentActivities( mainIntent, 0);

然后用以下代码为每个 ResolveInfo 加载图标:

.loadIcon(application.getPackageManager());

这给了我应用程序的图标,但不是图标包中的图标而是默认的图标。

如果有一个可用的图标包图标,如何访问应用程序的图标包图标?

1个回答

13

回答自己的问题。这里是一个简短的教程(包括伪代码),介绍从图标包中加载图标。

获取已安装的图标包

查找具有意图过滤器com.gau.go.launcherex.themeorg.adw.launcher.THEMES的应用程序。可能还存在其他的。例如使用:

PackageManager.queryIntentActivities(new Intent("org.adw.launcher.THEMES"), PackageManager.GET_META_DATA);

加载appfilter.xml

这个文件可以在应用图标包的资源或资产文件夹中找到。请使用以下任一方式:

int i = Resources.getIdentifier("appfilter", "xml", "iconpack.package.name");
Resources.getXml(i);

或者
InputStream s = iconPackres.getAssets().open("appfilter.xml");
XmlPullParserFactory f = XmlPullParserFactory.newInstance();
f.setNamespaceAware(true);
XmlPullParser p = f.newPullParser();
p.setInput(s, "utf-8");

解析appfilter.xml

Appfilter.xml描述了图标包的内容。其中,主题制作者有能力在背景上绘制图标、提供遮罩等等。这些都在XDA上有详细说明:http://forum.xda-developers.com/showthread.php?t=1649891。我们最感兴趣的是<item>标签,例如:

<item component="ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}" drawable="com_android_browser_browseractivity" />
component属性包含包名和活动名称,drawable则是图标包中对应图标的名称。遍历上一步中得到的XmlPullParser以查找所需的图标。

加载图标

只需使用component名称获取要加载其图标的应用程序的名称即可。

PackageManager.getLaunchIntentForPackage("app.package.name").getComponent().toString();

使用以下代码加载图标:
Resources.getIdentifier(componentName, "drawable", "app.package.name"); 
Resources.getDrawable(...)

你能看一下我的问题吗?我尝试根据你的解释来加载一个图标包中的图标,但是我无法让它工作... http://stackoverflow.com/questions/31490630/how-to-load-icon-from-icon-pack - prom85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接