首页 > 代码库 > android判断和创建快捷方式(4.03测试通过)

android判断和创建快捷方式(4.03测试通过)

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;
		}
	}