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<PackageInfo> 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;
}  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值