Android创建快捷方式以及判断快捷方式是否已经存在

最近项目中遇到需要在桌面创建快捷方式,创建之前需要判断快捷方式是否存在,一般来说快捷方式的相关操作都需要用到launcher的一些权限,通过查询favorites表来判断是否已经有了这个快捷方式。

1.首先加入权限

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />

2.由于Android的碎片化问题,所以第二步就是获取launcher的授权(此处理解为系统的Launcher.settings的包名)

private String getAuthorityFromPermission(Context context, String permission){
    if (permission == null) return null;
    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;
}

3.现在就可以判断是否存在快捷方式

private boolean hasShortcut(Context cx) {
    boolean isAdded = false;
    ContentResolver cr = getContentResolver();
    String authority = getAuthorityFromPermission(this.getApplicationContext(), "com.android.launcher.permission.READ_SETTINGS");
    Uri contentUri = Uri.parse("content://"+authority+"/favorites?notify=true");
    Cursor c = cr.query(contentUri, new String[] { "title", "iconResource" }, "title=?" , new String[] { getString(R.string.shotcut_name) }, null);
    if(c!=null && c.getCount()>0){
        isAdded = true;
    }
    return isAdded;
}

 

4.创建快捷方式

Intent addSC=new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
String title=getResources().getString(R.string.shotcut_name);
Parcelable icon=Intent.ShortcutIconResource.fromContext(activity, R.drawable.ic_launcher_scan);
Intent launcherIntent=new Intent(ScanQRActivity.this, ScanQRActivity.class);
addSC.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
addSC.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
addSC.putExtra(Intent.EXTRA_SHORTCUT_INTENT,launcherIntent);
sendBroadcast(addSC);

 

标签:none