如何在启动器主屏幕上放置应用程序图标?

时间:2011-01-31 17:47:25

标签: android

如您所知,当正常安装应用时,会在启动器菜单屏幕上创建图标。 我想要做的是在安装过程中在用户主屏幕上创建图标。 (不按图标5秒钟。)

我从另一个来源听到这个只是添加

<category android:value="android.intent.category.HOME" />

到AndroidManifest.xml文件,但它没有用。

还有其他办法吗?

6 个答案:

答案 0 :(得分:16)

您可以使用:

Intent shortcutIntent = new Intent();
shortcutIntent.setClassName("packageName", "className");
//shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Intent addIntent = new Intent();
addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "shortcut_name");
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(context, R.drawable.icon));
//intent.putExtra("duplicate", false);
addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
            context.sendBroadcast(addIntent);

您必须在AndroidManaifest.xml中使用以下权限

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

您可以根据自己的要求使用注释代码。

请注意,或许,上面的API没有记录。但它确实有效。

答案 1 :(得分:9)

现在,Google Play服务已解决了这个问题。您不必再添加任何代码来执行此操作。现在,当您从Google Play商店安装应用时,它会自动在主屏幕中创建徽标。它可以在Google Play商店设置中处理。 例外:如果您使用任何自定义ROM或发射器,它不适用于某些。

答案 2 :(得分:7)

我使用这些方法来正确添加或删除快捷方式。当用户手动添加/删除快捷方式时,这些方法运行良好,与Android系统相同。

public static void addShortcut(Context context)
{
    Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");

    ApplicationInfo appInfo = context.getApplicationInfo();

    // Shortcut name
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appInfo.name);
    shortcut.putExtra("duplicate", false); // Just create once

    // Setup activity shoud be shortcut object 
    ComponentName component = new ComponentName(appInfo.packageName, appInfo.className);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(component));

    // Set shortcut icon
    ShortcutIconResource iconResource = Intent.ShortcutIconResource.fromContext(context, appInfo.icon);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

    context.sendBroadcast(shortcut);
}

public static void deleteShortcut(Context context)
{
    Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");

    ApplicationInfo appInfo = context.getApplicationInfo();

    // Shortcut name
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, appInfo.name);

    ComponentName comp = new ComponentName(appInfo.packageName, appInfo.className);
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));

    context.sendBroadcast(shortcut);
}

Permissions:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

BroadcastReceiver:

<receiver android:name="YOUR.PACKAGE.PackageReplacedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <data android:scheme="package" android:path="YOUR.PACKAGE" />
    </intent-filter>
</receiver>

答案 3 :(得分:2)

我在上面的答案中遇到了麻烦,那是因为API 22和其他API在调试/仿真模式下的getApplicationInfo()。className上返回:
“com.android.tools.fd.runtime.BootstrapApplication”

最重要的是我需要为类名设置类的完整路径。 (见变化)

例如,我有以下内容:
的packageName = com.example.user.myapp
的className = MainActivity

Kailash answer我需要更改此行:

shortcutIntent.setClassName("packageName", "className");

shortcutIntent.setClassName("com.example.user.myapp", "com.example.user.myapp.MainActivity");



ChristopheCVBs answer我需要更改此行:

ComponentName comp = new ComponentName(appInfo.packageName, appInfo.className);

ComponentName comp = new ComponentName(appInfo.packageName, appInfo.packageName+".MainActivity");

答案 4 :(得分:1)

适用于所有设备(<26>26)的健壮解决方案。

createShortcutOnHome(CurrentActivity.this, ActivityToOpen.class, "app name", R.mipmap.ic_launcher);

此方法可以放在您的实用程序中。

 public static void createShortcutOnHome(@NonNull Activity activity, Class activityToOpen, String title, @DrawableRes int icon) {
        Intent shortcutIntent = new Intent(activity, activityToOpen);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { // code for adding shortcut on pre oreo device 
            Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
            intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
            intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
            intent.putExtra("duplicate", false);
            Parcelable parcelable = Intent.ShortcutIconResource.fromContext(activity, icon);
            intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, parcelable);
            activity.sendBroadcast(intent);
            System.out.println("added_to_homescreen");
        } else { 
            ShortcutManager shortcutManager = activity.getSystemService(ShortcutManager.class);
            assert shortcutManager != null;
            if (shortcutManager.isRequestPinShortcutSupported()) {
                ShortcutInfo pinShortcutInfo =
                        new ShortcutInfo.Builder(activity, "browser-shortcut-")
                                .setIntent(shortcutIntent)
                                .setIcon(Icon.createWithResource(activity, icon))
                                .setShortLabel(title)
                                .build();

                shortcutManager.requestPinShortcut(pinShortcutInfo, null);
                System.out.println("added_to_homescreen");
            } else {
                System.out.println("failed_to_add");
            }
        }
    }

答案 5 :(得分:-1)

您可以创建一个setup函数,用户可以使用该函数执行所有可能的操作。例如,创建任何必要的用户可访问文件夹(如果它们尚不存在),将快捷方式添加到主屏幕,和/或加载初始数据。

这是我现在正在写的一个函数,所以希望结果很好。但是,关键是要将它从onCreate()中移除,以便每次都不会被调用!