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;
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章