Android Shortcuts 为其他应用创建桌面快捷方式,替换图标等
shortcuts功能自android N_MR1(7.1,api 25)引入,使用ShortcutManager管理,
关于创建桌面图标pinned shortcuts是android O(8.0 api 26添加的,但是可以通过support包在低版本兼容)
- 在查看官方文档时发现有这么一段话
Note: See also the support library APIs, isRequestPinShortcutSupported() and requestPinShortcut(), which work on Android 7.1 (API level 25) and lower. The support library falls back to the deprecated EXTRA_SHORTCUT_INTENT extra to attempt the pinning process.
- 创建桌面快捷图标在安卓7.1之前可以通过support(android.support.v4.content.pm)包兼容
创建
直接看代码
class ShortcutIconBean{
@JsonName("name")
private String name;
@JsonName("packageName")
private String packageName;
@JsonName("iconPath")
private String iconPath;
}
class xxx{
/**添加快捷方式
*@param shortcutInfoIntent 创建桌面图标以后点击的执行逻辑
*
* */
private void addShortcut(Intent shortcutInfoIntent,ShortcutIconBean shortCut) {
Bitmap bitmap = BitmapUtils.decodeFile(shortCut.getIconPath());
if (bitmap == null){
Log.i(TAG,"bitmap == null");
return;
}
String id = mThemeId + "-" + shortCut.getName() + "-" + System.currentTimeMillis();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Log.i(TAG," Android O");
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo info = new ShortcutInfo.Builder(this, id)
.setIcon(Icon.createWithBitmap(bitmap))
.setShortLabel(shortCut.getName())
.setIntent(shortcutInfoIntent)
.build();
Intent successCallback = new Intent(ACTION);
/* //In your app's manifest file, add ACTION_CREATE_SHORTCUT to the activity's <intent-filter> element.
// 使用这个方式获取intent需要自己创建一个ACTIVITY管理创建成功回调,在ACTIVITY声明中加 ACTION_CREATE_SHORTCUT 过滤
Intent successCallback =
shortcutManager.createShortcutResultIntent(info);*/
PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(this, 200,
successCallback, PendingIntent.FLAG_UPDATE_CURRENT);
shortcutManager.requestPinShortcut( info, shortcutCallbackIntent.getIntentSender());
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
ShortcutInfoCompat info = new ShortcutInfoCompat.Builder(this, id)
.setIcon(IconCompat.createWithBitmap(bitmap))
.setShortLabel(shortCut.getName())
.setIntent(shortcutInfoIntent)
.build();
Intent successCallback = new Intent(ACTION);
//ACTION 处理创建结果的广播
PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(this, 200,
successCallback, PendingIntent.FLAG_UPDATE_CURRENT);
ShortcutManagerCompat.requestPinShortcut(this, info, shortcutCallbackIntent.getIntentSender());
// 注释部分为发广播的实现方式,不在使用
/* Log.i(TAG," Android N");
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.setClass( this, JumpActivity.class);
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launcherIntent.putExtra("packageName",shortCut.getPackageName());
// Intent launcherIntent = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
Intent installer = new Intent();
//false标示不重复创建
installer.putExtra("duplicate", false);
installer.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
//设置应用的名称
installer.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortCut.getName());
//设置图标
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 128, 128, true);
installer.putExtra(Intent.EXTRA_SHORTCUT_ICON,bitmap);
installer.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
//发送安装桌面图标的通知
sendBroadcast(installer);
Toast.makeText(this,"制作完成,请到桌面查看",Toast.LENGTH_SHORT).show();*/
}
}
}
版本判断然后执行不同代码,其实不同之处仅仅是将 ShortcutInfo 使用 ShortcutInfoCompat进行,
关于动态添加删除以及长按图标出现二级网上说得比较多
可参考shortcuts