在Android中创建快捷方式是很普遍的,是增加流量的一种方式。如果是原生系统,直接调用系统API就行了,但是众多厂商都有自己定制的桌面(Launcher),因此导致在适配、兼容方面存在很多问题。暂时虽然没有办法搞定所有的,但是仍然需要寻求一个最优的方案。
一、简单实现
增加快捷方式,这个需要在manifest文件中添加权限:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
具体实现:
/** * 创建快捷方式 * * @param name * @param icon * @param intent */ public void installShortCut(String name, int icon, Intent intent) { Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); // 快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); shortcut.putExtra("duplicate", false); // 不允许重复创建 // 快捷方式的图标 ShortcutIconResource iconRes = ShortcutIconResource.fromContext(mContext, icon); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes); intent.setAction("android.intent.action.MAIN");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标 intent.addCategory("android.intent.category.LAUNCHER");// 桌面图标和应用绑定,卸载应用后系统会同时自动删除图标 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); mContext.sendBroadcast(shortcut); }
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
/** * 删除桌面快捷方式 * @param context * @param shortcutName * 快捷方式名 * @param actionIntent * 快捷方式操作,也就是上面创建的Intent * @param isDuplicate * 为true时循环删除快捷方式(即存在很多相同的快捷方式) */ public static void deleteShortcut(Context context , String shortcutName , Intent actionIntent , boolean isDuplicate) { Intent shortcutIntent = new Intent ("com.android.launcher.action.UNINSTALL_SHORTCUT"); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME ,shortcutName); shortcutIntent.putExtra("duplicate" , isDuplicate); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT , actionIntent); context.sendBroadcast(shortcutIntent); }
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS" /> <uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS" /> <uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS" /> <uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS" /> <uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS" /> <uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS" /> <uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA" />
最后加上一个判断快捷方式是否存在的方法:
public String getLauncherPackageName(Context context) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); ResolveInfo res = context.getPackageManager() .resolveActivity(intent, 0); if (res.activityInfo == null) { return ""; } if (res.activityInfo.packageName.equals("android")) { return ""; } else { return res.activityInfo.packageName; } } public boolean hasShortcut(String name) { String url; String packageName = getLauncherPackageName(mContext); if (packageName == null || packageName.equals("") || packageName.equals("com.android.launcher")) { int sdkInt = android.os.Build.VERSION.SDK_INT; if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的 packageName = "com.android.launcher.settings"; } else if (sdkInt < 19) {// Android 4.4以下 packageName = "com.android.launcher2.settings"; } else {// 4.4以及以上 packageName = "com.android.launcher3.settings"; } } url = "content://" + packageName + ".settings/favorites?notify=true"; try { ContentResolver resolver = mContext.getContentResolver(); Cursor cursor = resolver.query(Uri.parse(url), new String[] { "title", "iconResource" }, "title=?", new String[] { name }, null); if (cursor != null && cursor.getCount() > 0) { return true; } } catch (Exception e) { if (e != null) { e.printStackTrace(); } } return false; }
工具类地址:https://github.com/xuwt/Utils/blob/master/LauncherUtils.java
参考:http://blog.zanlabs.com/2015/03/14/android-shortcut-summary/