在我的应用中使用图标包

ric*_*fox 3 android android-launcher

我的应用程序包含一个功能,用于列出用户设备上安装的所有应用程序,并附带图标.现在,用户在此列表中请求图标包支持.

目前我列出已安装的应用程序:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

final List<ResolveInfo> rgRi = pm.queryIntentActivities( mainIntent, 0);
Run Code Online (Sandbox Code Playgroud)

然后为每个加载图标ResolveInfo:

.loadIcon(application.getPackageManager());
Run Code Online (Sandbox Code Playgroud)

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

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

ric*_*fox 13

回答我自己的问题.这是一个关于从图标包加载图标的简短教程(包含伪代码).

获取已安装的图标包

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

PackageManager.queryIntentActivities(new Intent("org.adw.launcher.THEMES"), PackageManager.GET_META_DATA);
Run Code Online (Sandbox Code Playgroud)

加载appfilter.xml

它可以作为资源或图标包的assets文件夹中找到.使用其中之一

int i = Resources.getIdentifier("appfilter", "xml", "iconpack.package.name");
Resources.getXml(i);
Run Code Online (Sandbox Code Playgroud)

要么

InputStream s = iconPackres.getAssets().open("appfilter.xml");
XmlPullParserFactory f = XmlPullParserFactory.newInstance();
f.setNamespaceAware(true);
XmlPullParser p = f.newPullParser();
p.setInput(s, "utf-8");
Run Code Online (Sandbox Code Playgroud)

解析appfilter.xml

Appfilter.xml描述图标包内容.除此之外,themer还能够在背景上绘制图标,提供面具等.这些都在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" />
Run Code Online (Sandbox Code Playgroud)

component属性包含包和活动drawable的名称,并且是图标包中匹配图标的名称.循环执行XmlPullParser上一步,找到所需的图标.

加载图标

只需获取要加载其图标的应用程序的组件名称即可

PackageManager.getLaunchIntentForPackage("app.package.name").getComponent().toString();
Run Code Online (Sandbox Code Playgroud)

比加载图标

Resources.getIdentifier(componentName, "drawable", "app.package.name"); 
Resources.getDrawable(...)
Run Code Online (Sandbox Code Playgroud)