android判断和创建快捷方式(4.03测试通过)
整理了网上的创建方式的代码,对于快捷方式的判断使用系统api获取当前启动器来处理,这样系统定制过或者启动器不一样也没关系 。
一加权限和声明目标activity
<!-- 创建快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<activity android:name="com.shortcut.TestActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.Translucent" > <intent-filter> <action android:name="action.com.shortcut.test" /> </intent-filter> </activity>
二创建代码
/** * 创建快捷方式 * * @param context * @param name 显示名称 * @param url */ public static void createShortCut(Context context, String name, String url) { if (hasShortCut(context, name)) { Log.v("createShortCut", name + "快捷方式已存在"); return; } final Intent shortcutIntent = new Intent( "com.android.launcher.action.INSTALL_SHORTCUT"); shortcutIntent.putExtra("duplicate", false); final Parcelable icon = Intent.ShortcutIconResource.fromContext( context, ResourceUtil.getId(context, "drawable", "o2o_game_float_icon")); // 这个参数是启动的activity的action final Intent targetIntent = new Intent( "action.com.shortcut.test"); // 目标activity targetIntent.setClassName(context.getPackageName(), "com.shortcut.TestActivity"); targetIntent.putExtra("url", url); targetIntent.putExtra("name", name); targetIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); context.sendBroadcast(shortcutIntent); } /** * 判断快捷方式是否已存在 * * @param context * @param name * @return */ private static boolean hasShortCut(Context context, String name) { Log.v("LauncherPackageName", getLauncherPackageName(context)); String launcherPackage = getLauncherPackageName(context); if (TextUtils.isEmpty(launcherPackage)) { // 查询不到启动器时默认已存在快捷方式,不进行创建 return true; } // Log.v("LauncherPackageName", launcherPackage); boolean result = false; final String uriStr = "content://" + launcherPackage + ".settings/favorites?notify=true"; final Uri CONTENT_URI = Uri.parse(uriStr); final Cursor c = context.getContentResolver().query(CONTENT_URI, null, "title=?", new String[] { name }, null); if (c != null && c.getCount() > 0) { result = true; } return result; } /** * 获取正在运行桌面包名(注:存在多个桌面时且未指定默认桌面时,该方法返回"",使用时需处理这个情况) */ private static String getLauncherPackageName(Context context) { final Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); final ResolveInfo res = context.getPackageManager().resolveActivity( intent, 0); if (res.activityInfo == null) { // should not happen. A home is always installed, isn‘t it? return ""; } if (res.activityInfo.packageName.equals("android")) { // 有多个桌面程序存在,且未指定默认项时; return ""; } else { return res.activityInfo.packageName; } }