如您所知,当正常安装应用时,会在启动器菜单屏幕上创建图标。 我想要做的是在安装过程中在用户主屏幕上创建图标。 (不按图标5秒钟。)
我从另一个来源听到这个只是添加
<category android:value="android.intent.category.HOME" />
到AndroidManifest.xml文件,但它没有用。
还有其他办法吗?
答案 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()
中移除,以便每次都不会被调用!