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

    由于很多厂商对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;
}  

你可能感兴趣的:(Android)