4

I have an Android appwidget which shows icons of other applications on it.

I get the other applications icons with appInfo.loadIcon and then I set it to the widgets with setImageViewBitmap.

The problem is that if I have too many icons on the widget, I get "FAILED BINDER TRANSACTION" error. I understand that it's from a size limit and the solution it to use the image uri instead of the bitmap itself.

Is there an accessible URI to other applications' icons?

Thanks.

Ran
  • 4,117
  • 4
  • 44
  • 70

3 Answers3

14

In case you don't know the resource name, you can also access resources by their id:

android.resource://[package]/[res_id]

The resource id of the app icon is available in the ApplicationInfo of the app:

ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
if(appInfo.icon != 0) {
    Uri uri = Uri.parse("android.resource://" + packageName + "/" + appInfo.icon);
}
Sven
  • 559
  • 5
  • 6
8

While @CommonWare's answer is good in many cases, I find that this is often easier: android.resource://[package]/[res id] - especially when you want a reference to for instance the launcher icon of some other app.

Community
  • 1
  • 1
Zap
  • 81
  • 1
  • 3
5

Try android.resource://[package]/[res type]/[res name], where [res type] in your case would be drawable. The package and name would have to come from the ResolveInfo or wherever you are getting your data.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491