Android修改桌面快捷方式的图片和名称

????项目要求在应用运行过程中生成了桌面快捷方式,这个很简单,网上很多资料,但是除了这个还要在应用中修改这些快捷方式的图标和名字,找了很久没有找到方法。
????怎么办呢……
????正在苦恼的时候突然想到:查询快捷方式的时候使用getContentResolver().query()方法查询的,这不就是ContentProvider提供数据的么,既然如此,那除了query()方法,肯定还有update()方法的,找了一下果然有,然后开始测试,发现果然能修改。
????修改之前需要知道名称和图片的列表和数据类型,方法为:通过打印query()方法查询出来的数据,直接按String类型打印,错了的话,在报错信息中能找到真正的类型,从而得知快捷方式名称的列名为”title”类型为String,图片的列名为”icon”类型为Blob,Bolb类型保存的是二进制数据,因此修改的时候需要把数据转换成”byte[]”才能保存,有了这些东西之后,就能修改图片和名称了

/** * 根据图标名字更新图标的图片和名字 * @param oldName * @param newName * @param bitmap */ public void updateShortcut(String oldName, String newName, Bitmap bitmap) { // Bitmap --> byte[] ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); ContentValues values = new ContentValues(); values.put("icon", baos.toByteArray()); values.put("title", newName); // 图标的数据表路径 String url = null; String pName = getAuthorityFromPermission(); if (pName != null && !"".equals(pName)) { return "content://" + pName + "/favorites?notify=true"; } pName = getLauncherPackageName(); if (pName != null && !"".equals(pName)) { return "content://" + pName + ".settings/favorites?notify=true"; } if (Build.VERSION.SDK_INT < 19) { return "content://com.android.launcher2.settings/favorites?notify=true"; } else { return "content://com.android.launcher3.settings/favorites?notify=true"; } // 修改 context.getContentResolver().update(Uri.parse(url), values, String.format("title=\"%s\"", oldName), null); }

【Android修改桌面快捷方式的图片和名称】????由于很多厂商对Launcher做了定制,因此Launcher的包名就不一定是com.android.launcher2了,因此需要使用如下方法获取手机当前Launcher包名
/** * 获取Launcher的包名 * * @return */ private static String getAuthorityFromPermission() { String permission = "com.android.launcher.permission.READ_SETTINGS"; // 权限 List packs = context.getPackageManager() .getInstalledPackages(PackageManager.GET_PROVIDERS); if (packs != null) { for (PackageInfo pack : packs) { ProviderInfo[] providers = pack.providers; if (providers != null) { for (ProviderInfo provider : providers) { if (permission.equals(provider.readPermission)) return provider.authority; if (permission.equals(provider.writePermission)) return provider.authority; } } } } return null; }

    推荐阅读