項目要求在應用運行過程中生成了桌面快捷方式,這個很簡單,網上很多資料,但是除了這個還要在應用中修改這些快捷方式的圖標和名字,找了很久沒有找到方法。
怎麼辦呢……
正在苦惱的時候突然想到:查詢快捷方式的時候使用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;
}