如何正确引用另一个应用程序的图标文件来创建主屏幕快捷方式

How can I correctly reference the icon file of another app to create a homescreen shortcut

我正在开发应用程序抽屉的替代品,但我无法让用户创建主屏幕图标。

我可以创建快捷方式,但我很难从相应的应用程序中提取图标。

我使用以下方式收集有关应用程序的信息:

    manager = getPackageManager();
    apps = new ArrayList<AppDetail>();

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

    List<ResolveInfo> availableActivities = manager.queryIntentActivities(i,0);

    Collections.sort(availableActivities, new ResolveInfo.DisplayNameComparator(manager));

    for(ResolveInfo ri:availableActivities){
        AppDetail app = new AppDetail();

        app.name = ri.activityInfo.packageName;

        app.label = ri.loadLabel(manager);
        app.icon = ri.activityInfo.loadIcon(manager);
        app.iconID = ri.getIconResource();
        apps.add(app);

但是我 运行 在尝试创建快捷方式时遇到了麻烦

        AppDetail selectedApp = apps.get(info.position);

...

        Intent shortcutIntent = new Intent(this, selectedApp.getClass());
        shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        final Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, selectedApp.label);

        // the danger zone
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(getBaseContext(),selectedApp.iconID));

        intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

        sendBroadcast(intent);
        finish();

如何正确引用其他应用的图标文件?

请使用

Drawable icon = manager.getApplicationIcon(app.name);

获取图标图形,

final Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, selectedApp.label);

// this line in your code changed
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon.getBitmap());

intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(intent);